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

news/2024/5/20 9:10:44

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.mrgr.cn/p/36476630

相关文章

Linux进程间通信:system V共享内存

目录 一、什么是共享内存 1.1创建共享内存 1.2释放共享内存 1.2.1shmctl 1.2.2shmat 1.2.3 shmdt 二、共享内存的实现及使用 2.1ShmClient 2.2Shm_Server 2.3Fifo.hpp 2.4Comm.hpp 一、什么是共享内存 标准系统V也叫system V的本地通信方式一般有三种&#xff1a; …

GitHub two-factor authentication开启教程

GitHub two-factor authentication开启教程问题描述 最近登录GitHub个人页面动不动就有一个提示框”...... two-factor authentication will be required for your account starting Jan 4, 2024 ......“,点击去看了一下原来是GitHub对所有的用户登录都要开启双重身份认证,…

Windows程序读取不了中文路径问题

解决win32接口无法解析中文路径的问题问题描述 今天调试发现win32接口GetFileAttributesW居然不支持中文路径,于是寻找解决方案,找了半天,尝试用boost的fileystem库发现能用,而且boost能跨平台! 不支持中文 win32接口获取文件属性,当传入参数带有中文字符时,它获取的属性…

栈和队列的4道面试题【详细解析】【代码实现】

栈和队列的面试题 1.有效的括号&#xff08;栈实现&#xff09; 题目&#xff1a; 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必…

紧跟生成式AI暴雨发布新时代推理服务器

近日&#xff0c;暴雨发布最新训推一体AI服务器&#xff0c;以大容量内存和灵活的高速互连选项满足各种AI应用场景&#xff0c;最大可能支持扩展插槽&#xff0c;从而大幅提升智能算力性能&#xff0c;以最优的性能和成本为企业的模型训练推理落地应用提供更好的通用算力。 AIG…

Java里的String使用

1.Java WinForm项目 public static void main(String[] args) {String testString"22";String testString2"1096";String testString3"22";Student studentnew Student();student.Age"22";Test(student.Age);Test2(student.Age); }pu…

【Qt QML】QLibrary加载共享库中的类

QLibrary是一个用于加载动态链接库&#xff08;或称为共享库&#xff09;的类。它提供了一种独立于平台的方式来访问库中的功能。 在QLibrary中&#xff0c;可以通过构造函数或setFileName()方法设置要加载的库文件名。当加载库文件时&#xff0c;QLibrary会搜索所有平台特定的…

trunk聚合

Eth-Trunk又叫以太网链路聚合Eth-Trunk,它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路。达到增加链路带宽的目的。在实现增大带宽目的的同时,Eth-Trunk采用备份链路的机制,可以有效的提高设备之间链路的可靠性。每个聚合组唯一对应着一个逻辑接口,这个逻辑接口称之…

buuctf-pwn-[OGeek2019]babyrop

查看一下保护情况丢进ida里分析主函数调用了一个含有alarm的函数,这个函数会设置一个定时器,到时间自动退出程序 为了方便调试,我们直接patch掉这个函数 接着分析,主函数读入了一个随机数,并将其传入sub_804871F函数 sub_804871F函数读取输入,并检查输入的是否和随机数相…

Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】

1、数组 特别需要注意的是&#xff1a;在 Go 语言中&#xff0c;数组长度也是数组类型的一部分&#xff01;所以尽管元素类型相同但是长度不同的两个数组&#xff0c;它们的类型并不相同。 1.1、数组的初始化 1.1.1、通过初始化列表{}来设置值 var arr [3]int // int类型的数…

团队作业4——项目冲刺 第 2篇 Scrum 冲刺博客

这个作业属于哪个课程 软件工程这个作业要求在哪里 团队作业4——项目冲刺这个作业的目标 团队完成任务的分配,明确团队每个人在接下来七天敏捷冲刺的目标其他参考文献这个作业所属团队 SuperNewCode团队成员 张楠 曾琳备 黄铭涛 张小宇 周广1.每日举行站立时会议2.燃尽图3.每…

WordPress MasterStudy LMS插件 SQL注入漏洞复现(CVE-2024-1512)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress Plugin MasterStudy LMS 3.2.5 版本及之…

【北京迅为】《iTOP-3588开发板快速烧写手册》-第8章 TF启动

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

vue案例

任务清单(单文件) <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>模板</title><sc…

【C++】滑动窗口:最大连续1的个数

1.题目 2.算法思路 其实在做这道题的时候并不需要真的把0翻转成1&#xff0c;只需要找到最长的子数组且该子数组中0的个数不大于K&#xff0c;就可以了&#xff01; 当然我们首先想到的是暴力穷举法&#xff1a; 找到所有符合题意的子数组&#xff0c;跳出最长的那个就可以了…

s7netplus二次应用

1. 安装这是个基于S7协议的开源协议2. 引用 using S7.Net;3. 创建PLC对象internal class s7net_lib{//idenfy basic link paramsprivate string plc_ip;private CpuType plc_type;private short plc_rack, plc_slot;public Plc my_plc;//constructor,含参构造函数 public s7ne…

MySQL-09.性能分析工具的使用

1.数据库服务器的优化步骤当遇到数据库调优问题时,思考的流程如下图。 整个流程划分成了观察(Show status)和行动(Action)两个部分。字母S的部分代表观察(会使用相应的分析工具),字母A代表的部分是行动(对应分析可以采取的行动)。上图,就是数据库调优的思路。如果发现执行SQ…

JENKINS 安装,学习运维从这里开始

Download and deployJenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their softwarehttps://www.jenkins.io/download/首先点击上面。下载Jenkins 为了学习&#xff0c;从windows开始&#x…

Tkinter组件:Checkbutton

Tkinter组件&#xff1a;Checkbutton Checkbutton&#xff08;多选按钮&#xff09;组件用于实现确定是否选择的按钮。Checkbutton 组件可以包含文本或图像&#xff0c;你可以将一个 Python 的函数或方法与之相关联&#xff0c;当按钮被按下时&#xff0c;对应的函数或方法将被…