C++学习第二十六课:自适应容器——栈和队列

C++学习第二十六课:自适应容器——栈和队列

在C++标准模板库(STL)中,自适应容器提供了一种使用标准容器作为底层数据存储的抽象。std::stackstd::queue是两种常用的自适应容器,它们分别提供了栈和队列这两种线性数据结构的后端实现。本课将详细介绍这两种自适应容器的使用方法,并通过示例代码展示其应用。

1. 自适应容器概述

自适应容器是STL提供的容器适配器,它们定义了一组操作,这些操作限制了底层容器的某些能力。

2. std::stack的使用

std::stack是一个后进先出(LIFO)的容器,只允许在容器的一端进行添加和移除操作。

示例代码
#include <stack>
#include <vector>

int main() {
    std::stack<int> s;
    s.push(1); // 添加元素到栈顶
    s.push(2);
    s.push(3);

    while (!s.empty()) {
        std::cout << ' ' << s.top(); // 访问栈顶元素
        s.pop(); // 移除栈顶元素
    }
    return 0;
}

3. std::queue的使用

std::queue是一个先进先出(FIFO)的容器,只允许在容器的两端进行添加和移除操作。

示例代码
#include <queue>
#include <vector>

int main() {
    std::queue<int> q;
    q.push(1);
    q.push(2);
    q.push(3);

    while (!q.empty()) {
        std::cout << ' ' << q.front(); // 访问队首元素
        q.pop(); // 移除队首元素
    }
    return 0;
}

4. std::stackstd::queue的底层实现

通常,std::stackstd::queue使用std::vectorstd::dequestd::list作为底层容器。

5. 自适应容器的迭代器

与标准容器不同,自适应容器只提供了有限的迭代器功能。

示例代码
// std::stack不支持迭代器
// std::queue只支持输入迭代器

6. 自适应容器的模板参数

std::stackstd::queue可以指定底层容器类型作为模板参数。

示例代码
std::stack<int, std::list<int>> stack; // 使用std::list作为底层容器

除了栈(std::stack)和队列(std::queue)之外,还有其他几个重要的概念和容器值得关注。

7. 优先队列 (`std::priority_queue)

优先队列是一种特殊类型的队列,其中每个元素都有特定的优先级。std::priority_queue通常基于堆数据结构实现。

示例代码
#include <queue>
#include <vector>

int main() {
    std::priority_queue<int> pq;
    pq.push(30);
    pq.push(10);
    pq.push(20);

    while (!pq.empty()) {
        std::cout << pq.top() << std::endl; // 输出最高优先级的元素
        pq.pop();
    }
    return 0;
}

8. 双端队列 (`std::deque)

双端队列(std::deque)是一个允许在两端快速添加和移除元素的容器。

示例代码
#include <deque>
#include <iostream>

int main() {
    std::deque<int> dq;
    dq.push_back(1);
    dq.push_front(0);
    dq.push_back(2);

    for (int num : dq) {
        std::cout << num << " ";
    }
    return 0;
}

9. 集合 (std::set) 和多重集合 (std::multiset)

集合是不允许重复元素的容器,而多重集合允许有重复的元素。

示例代码
#include <set>

int main() {
    std::set<int> s;
    s.insert(1);
    s.insert(2);
    s.insert(1); // 重复元素将被忽略

    for (int num : s) {
        std::cout << num << " ";
    }
    return 0;
}

10. 映射 (std::map) 和多重映射 (std::multimap)

映射是存储键值对的容器,其中每个键都是唯一的。多重映射允许有重复的键。

示例代码
#include <map>

int main() {
    std::map<int, std::string> m;
    m[1] = "one";
    m[2] = "two";
    m[1] = "uno"; // 更新键为1的元素

    for (const auto& pair : m) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    return 0;
}

11. 散列容器 (std::unordered_set, std::unordered_map)

散列容器使用哈希表作为底层数据结构,提供平均时间复杂度为O(1)的查找、插入和删除操作。

示例代码
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> um;
    um["one"] = 1;
    um["two"] = 2;

    for (const auto& pair : um) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    return 0;
}

12. 算法的使用

STL算法与自适应容器和标准容器的结合使用,进行数据操作。

示例代码
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    std::sort(v.begin(), v.end()); // 排序

    std::reverse(v.begin(), v.end()); // 反转

    int sum = std::accumulate(v.begin(), v.end(), 0); // 求和
    std::cout << "Sum: " << sum << std::endl;
    return 0;
}

13. 迭代器的使用

迭代器是STL中非常重要的概念,用于访问容器中的元素。

示例代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3};
    for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
        std::cout << *it << " ";
    }
    return 0;
}

结语

通过本课的学习,你深入了解了STL中的自适应容器——std::stackstd::queue,包括它们的使用方式、底层实现、模板参数、迭代器功能、与标准容器的比较、实际应用、线程安全性和性能考量。

自适应容器是C++中实现特定数据结构的强大工具,它们在需要栈和队列操作的场景下非常有用。掌握自适应容器的使用对于编写高效、可维护的C++程序至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/604968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux(openEuler、CentOS8)企业内网samba服务器搭建(Windows与Linux文件共享方案)

本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS8基本一致&#xff0c;可参考本文) 目录 知识点实验1. 安装samba2. 启动smb服务并设置开机启动3. 查看服务器监听状态4. 配置共享访问用户5. 创建共享文件夹6. 修改配置文件7. 配置防火墙8. 使用windows…

C++中的右值引用和移动语义

目录 1 左值引用和右值引用 2 左值引用与右值引用比较 3 右值引用使用场景和意义 4 右值引用引用左值及其一些更深入的使用场景分析 5 完美转发 6.常数右边引用 1 左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c…

数组中两个字符串的最小距离

给定一个字符串数组strs&#xff0c;再给定两个字符串str1和str2&#xff0c;返回在strs中str1和str2的最小距离&#xff0c;如果str1或str2为null&#xff0c;或不在strs中&#xff0c;返回-1。 输入描述&#xff1a; 输入包含有多行&#xff0c;第一输入一个整数n(1 ≤ n ≤…

Python | Leetcode Python题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; class Solution:def rotateRight(self, head: ListNode, k: int) -> ListNode:if k 0 or not head or not head.next:return headn 1cur headwhile cur.next:cur cur.nextn 1if (add : n - k % n) n:return headcur.next headwhi…

【Redis7】了解Redis

1.常见数据库 1.1.键值存储数据库 如 Map 一样的key-value 对&#xff0c;典型代表就是 Redis。 1.2.列存储数据库 关系型数据库是典型的行存储数据库&#xff0c;按行存储的数据在物理层面占用的是连续存储空间&#xff0c;不适合海量数据存储。而按列存储则可实现分布式存储&…

第七届机电、机器人与自动化国际会议(ICMRA 2024)即将召开!

第七届机电、机器人与自动化国际会议&#xff08;ICMRA 2024&#xff09;将于2024年9月20日-22日在中国武汉举行。ICMRA 2024为各国专家学者提供一个学术交流的平台&#xff0c;讨论机电、机器人和自动化领域的最新研究成果和未来的研究方向&#xff0c;旨在能够建立起国家间&a…

C语言常见的动态内存错误及几个经典笔试题以及c/c++内存开辟空间等的介绍

文章目录 前言一、常见的动态内存错误1. 对NULL指针的解引用操作2. 对动态开辟空间的越界访问3. 对非动态开辟内存使用free()4. 使用free释放一块动态开辟内存的一部分5. 对同一块动态内存多次释放6. 动态开辟内存忘记释放&#xff08;内存泄漏&#xff09; 二、几个经典笔试题…

三层交换机与防火墙连通上网实验

防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量。它可以帮助防止未经授权的访问&#xff0c;保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量&#xff0c;例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

element-ui table sortable排序 掉后端接口方式

实例: 官方解释:如果需要后端排序&#xff0c;需将sortable设置为custom&#xff0c;同时在 Table 上监听sort-change事件&#xff0c;在事件回调中可以获取当前排序的字段名和排序顺序&#xff0c;从而向接口请求排序后的表格数据。 1.table上要加 sort-change"sortCha…

XTuner微调LLM:1.8B、多模态和Agent

XTuner微调大语言模型&#xff0c;我们的介绍主要分为以下六个方面。 首先我们讲一下Finetune&#xff1a;分为两种Finetune范式和一条数据的一生来讲解。 为什么要微调&#xff1f;我们的大语言模型为基座模型&#xff0c;要应用到某种特定的场景&#xff0c;需要微调做相应适…

STC8增强型单片机开发——C51版本Keil环境搭建

一、目标 了解C51版本Keil开发环境的概念和用途掌握C51版本Keil环境的安装和配置方法熟悉C51版本Keil开发环境的使用 二、准备工作 Windows 操作系统Keil C51 安装包&#xff08;可以从Keil官网下载&#xff09;一款8051单片机开发板 三、搭建流程 环境搭建的基本流程&#xf…

做外贸用什么邮箱比较好?

外贸公司在推进公司业务时需要频繁进行跨国沟通&#xff0c;选择一款专业且功能强大的企业邮箱作为业务沟通工具至关重要。外贸企业邮箱需要满足5个基本内容&#xff0c;国际收发能力、安全稳定性、专业形象展示、功能完备性、客户服务与技术支持。本文将探讨做外贸时适合使用的…

C++语法|如何写出高效的C++代码(一)|对象使用过程中背后调用了哪些方法(构造和析构过程)?

文章目录 再探拷贝构造函数和重载复制运算符实例化新对象和赋值操作强转为类类型指针和引用时临时对象的构造和析构过程 考考你问题答案 再探拷贝构造函数和重载复制运算符 实例化新对象和赋值操作 首先我们写一个类&#xff0c;实现它的拷贝构造并重载赋值运算符。 class T…

封装Springboot基础框架功能-03

在些模块中汇总了一些web开发常用的配置和功能。 模块源码结构 Restful API常用定义 QueryParam请求参数 Data public class QueryParam {private String key;private String value; }RestfulController实现 RestfulController.java&#xff0c;主要汇总一些常用的restful的…

【C++】C++11--- 列表初始化|关键字

目录 前言 列表初始化 创建对象时的列表初始化 单参数隐式类型转换 多参数的隐式类型转换 new表达式中使用列表初始化 列表初始化适用于STL 容器 模板类initializer_list 关键字auto 关键字decltype 关键字nullptr 前言 C标准10年磨一剑&#xff0c;第二个真正意义上…

探索网站支付系统的奥秘,从Vue3和Spring Boot开始(入门级项目实战+在线教程)附赠项目源码!

你是否曾经在购物时&#xff0c;对着电脑屏幕前的“支付成功”四个字感到好奇&#xff1f;这背后的秘密究竟是什么&#xff1f; 今天&#xff0c;让我们一起揭开支付系统的神秘面纱&#xff0c;探索其背后的技术实现。 在这个基于Vue3和Spring Boot的支付项目实战中&#xff…

ChatGLM-Math:强化数学能力

大型语言模型&#xff08;LLM&#xff09;在文本摘要、问答和角色扮演对话等语言任务上表现出色&#xff0c;在数学推理等复杂问题上也具有应用潜力。 但目前提高 LLM 数学问题解决能力的方法&#xff0c;往往会导致其他方面能力的下降。例如RLHF的方法&#xff0c;虽然可以提…

Linux的虚拟机操作

一、linux系统 我们知道的系统用到的大多数是Windows系统。 Windows个人用到的有&#xff1a;win7 win10 win11 winxp 服务器用到的有&#xff1a;windows server 2003、2008、2013...........等等 linux也有系统。 centos 7 有5、6、8等等 redhat ubuntu kail 二、了…

Apple强大功能:在新款 iPad Pro 和 iPad Air 中释放 M4 芯片潜力

Apple 的最新强大功能&#xff1a;在新款 iPad Pro 和 iPad Air 中释放 M4 芯片的潜力 概述 Apple 推出配备强大 M4 芯片的最新 iPad Pro 和 iPad Air 型号&#xff0c;再次突破创新界限。新一代 iPad 有望彻底改变我们的工作、创造和娱乐方式。凭借无与伦比的处理能力、令人惊…

kubebuilder(6)webhook

operator中的webhook也是很重要的一块功能。也是相对比较独立的模块&#xff0c;所以放在后面讲。 webhook是一个callback&#xff0c;注册到k8s的api-server上。当某个特定的时间发生时&#xff0c;api server就会查询注册的webhook&#xff0c;并根据一些逻辑确认转发消息给…
最新文章