c++笔记容器详细介绍
C++标准库提供了多种容器来存储和管理数据。这些容器属于<vector>, <list>, <deque>, <map>, <set>, <unordered_map>, <unordered_set>等头文件中。这些容器各有优缺点,适用于不同的场景。下面详细介绍几种主要的容器及其支持的函数。
1. std::vector
std::vector 是动态数组,可以高效地进行随机访问,支持动态调整大小。
头文件:<vector>
主要函数:
push_back:在末尾添加元素。pop_back:移除末尾元素。at:访问指定位置的元素,带有边界检查。operator[]:访问指定位置的元素,不带边界检查。front:访问第一个元素。back:访问最后一个元素。data:返回底层数组的指针。size:返回元素个数。capacity:返回当前容量。resize:调整大小。reserve:预留空间。clear:清空所有元素。empty:检查容器是否为空。insert:在指定位置插入元素。erase:移除指定位置的元素。
2. std::list
std::list 是双向链表,支持高效的插入和删除操作。
头文件:<list>
主要函数:
push_back:在末尾添加元素。push_front:在头部添加元素。pop_back:移除末尾元素。pop_front:移除头部元素。front:访问第一个元素。back:访问最后一个元素。size:返回元素个数。clear:清空所有元素。empty:检查容器是否为空。insert:在指定位置插入元素。erase:移除指定位置的元素。remove:移除所有与指定值相等的元素。sort:对元素进行排序。merge:合并两个已排序的链表。splice:将一个链表中的元素移动到另一个链表中。
3. std::deque
std::deque 是双端队列,可以高效地在头部和尾部进行插入和删除操作。
头文件:<deque>
主要函数:
push_back:在末尾添加元素。push_front:在头部添加元素。pop_back:移除末尾元素。pop_front:移除头部元素。at:访问指定位置的元素,带有边界检查。operator[]:访问指定位置的元素,不带边界检查。front:访问第一个元素。back:访问最后一个元素。size:返回元素个数。clear:清空所有元素。empty:检查容器是否为空。insert:在指定位置插入元素。erase:移除指定位置的元素。
4. std::map
std::map 是有序关联容器,以键值对的形式存储元素,键是唯一的。
头文件:<map>
主要函数:
operator[]:访问或插入指定键的元素。at:访问指定键的元素,带有边界检查。insert:插入键值对。erase:移除指定键的元素。find:查找指定键的元素。count:返回指定键的元素个数(对于map,结果是0或1)。size:返回元素个数。clear:清空所有元素。empty:检查容器是否为空。begin:返回指向第一个元素的迭代器。end:返回指向最后一个元素后一个位置的迭代器。
5. std::set
std::set 是有序集合容器,只存储键,键是唯一的。
头文件:<set>
主要函数:
insert:插入元素。erase:移除指定元素。find:查找指定元素。count:返回指定元素的个数(对于set,结果是0或1)。size:返回元素个数。clear:清空所有元素。empty:检查容器是否为空。begin:返回指向第一个元素的迭代器。end:返回指向最后一个元素后一个位置的迭代器。
6. std::unordered_map
std::unordered_map 是无序关联容器,以键值对的形式存储元素,键是唯一的,内部使用哈希表实现。
头文件:<unordered_map>
主要函数:
operator[]:访问或插入指定键的元素。at:访问指定键的元素,带有边界检查。insert:插入键值对。erase:移除指定键的元素。find:查找指定键的元素。count:返回指定键的元素个数(对于unordered_map,结果是0或1)。size:返回元素个数。clear:清空所有元素。empty:检查容器是否为空。begin:返回指向第一个元素的迭代器。end:返回指向最后一个元素后一个位置的迭代器。
7. std::unordered_set
std::unordered_set 是无序集合容器,只存储键,键是唯一的,内部使用哈希表实现。
头文件:<unordered_set>
主要函数:
insert:插入元素。erase:移除指定元素。find:查找指定元素。count:返回指定元素的个数(对于unordered_set,结果是0或1)。size:返回元素个数。clear:清空所有元素。empty:检查容器是否为空。begin:返回指向第一个元素的迭代器。end:返回指向最后一个元素后一个位置的迭代器。
容器特性和使用注意事项
1. std::vector
- 特性:
- 动态数组,支持快速随机访问。
- 连续存储,能与 C 风格数组兼容。
- 在末尾插入和删除操作效率高(摊销时间复杂度 O(1))。
- 插入和删除操作会导致内存重新分配和元素拷贝(特别是当容器扩容时)。
- 注意事项:
- 适用于需要频繁随机访问元素的场景。
- 避免在中间位置频繁插入和删除元素。
2. std::list
- 特性:
- 双向链表,支持双向遍历。
- 插入和删除操作效率高,O(1)。
- 不支持随机访问,只能通过迭代器遍历。
- 内存使用相对较高,每个节点需要额外存储两个指针。
- 注意事项:
- 适用于需要频繁插入和删除元素的场景。
- 不适用于需要快速随机访问的场景。
3. std::deque
- 特性:
- 双端队列,支持在两端快速插入和删除。
- 随机访问效率高,O(1)。
- 内部由多个连续块组成,分配和管理较为复杂。
- 注意事项:
- 适用于需要在两端进行插入和删除操作的场景。
- 插入和删除操作在中间位置的效率相对较低。
4. std::map
- 特性:
- 有序关联容器,基于红黑树实现。
- 键值对存储,键是唯一的。
- 查找、插入、删除操作效率为 O(log n)。
- 自动按键排序。
- 注意事项:
- 适用于需要有序存储和快速查找的场景。
- 不适用于需要频繁插入和删除的场景。
5. std::set
- 特性:
- 有序集合容器,基于红黑树实现。
- 只存储键,键是唯一的。
- 查找、插入、删除操作效率为 O(log n)。
- 自动按键排序。
- 注意事项:
- 适用于需要有序存储和快速查找的场景。
- 不适用于需要频繁插入和删除的场景。
6. std::unordered_map
- 特性:
- 无序关联容器,基于哈希表实现。
- 键值对存储,键是唯一的。
- 查找、插入、删除操作效率平均为 O(1)。
- 无序存储,插入顺序不定。
- 注意事项:
- 适用于需要快速查找的场景。
- 不适用于需要有序存储的场景。
7. std::unordered_set
- 特性:
- 无序集合容器,基于哈希表实现。
- 只存储键,键是唯一的。
- 查找、插入、删除操作效率平均为 O(1)。
- 无序存储,插入顺序不定。
- 注意事项:
- 适用于需要快速查找的场景。
- 不适用于需要有序存储的场景。
对比表格
| 特性\容器 | std::vector | std::list | std::deque | std::map | std::set | std::unordered_map | std::unordered_set |
|---|---|---|---|---|---|---|---|
| 随机访问 | 高效 (O(1)) | 不支持 | 高效 (O(1)) | 不支持 | 不支持 | 高效 (O(1)) | 高效 (O(1)) |
| 插入/删除末尾 | 高效 (摊销 O(1)) | 低效 (O(n)) | 高效 (O(1)) | 中等 (O(log n)) | 中等 (O(log n)) | 高效 (平均 O(1)) | 高效 (平均 O(1)) |
| 插入/删除头部 | 低效 (O(n)) | 高效 (O(1)) | 高效 (O(1)) | 中等 (O(log n)) | 中等 (O(log n)) | 高效 (平均 O(1)) | 高效 (平均 O(1)) |
| 插入/删除中间 | 低效 (O(n)) | 高效 (O(1)) | 低效 (O(n)) | 中等 (O(log n)) | 中等 (O(log n)) | 高效 (平均 O(1)) | 高效 (平均 O(1)) |
| 查找 | 高效 (O(1)) | 低效 (O(n)) | 高效 (O(1)) | 高效 (O(log n)) | 高效 (O(log n)) | 高效 (平均 O(1)) | 高效 (平均 O(1)) |
| 有序性 | 无序 | 无序 | 无序 | 有序 | 有序 | 无序 | 无序 |
| 内存使用 | 紧凑 | 高 (额外指针) | 较高 (分块) | 较高 (树结构) | 较高 (树结构) | 较高 (哈希表) | 较高 (哈希表) |
| 适用场景 | 频繁随机访问 | 频繁插入/删除 | 双端操作频繁 | 有序存储和快速查找 | 有序存储和快速查找 | 快速查找和无序存储 | 快速查找和无序存储 |
使用建议
每种容器在不同的场景中都有其优势,选择合适的容器可以大大提升程序的性能和代码的可维护性:
std::vector:当需要高效的随机访问和动态调整大小时,使用std::vector。适合存储大量数据并且需要频繁遍历的情况。std::list:当需要频繁插入和删除元素,尤其是中间位置的元素时,使用std::list。适合实现双向链表。std::deque:当需要高效的头部和尾部操作时,使用std::deque。适合实现队列和双端队列。std::map:当需要有序存储和快速查找键值对时,使用std::map。适合实现有序关联容器。std::set:当需要有序存储唯一元素时,使用std::set。适合实现集合操作。std::unordered_map:当需要无序存储和高效查找键值对时,使用std::unordered_map。适合实现哈希表。std::unordered_set:当需要无序存储唯一元素时,使用std::unordered_set。适合实现无序集合。
相关文章:
c++笔记容器详细介绍
C标准库提供了多种容器来存储和管理数据。这些容器属于<vector>, <list>, <deque>, <map>, <set>, <unordered_map>, <unordered_set>等头文件中。这些容器各有优缺点,适用于不同的场景。下面详细介绍几种主要的容器及其…...
CS144 Lab3 TCPSender复盘
一.基础概念 1.TCPSender在TCPSocket中的地位与作用 Lab0中实现了基于内存模拟的流控制-字节流(ByteStream),底层使用std::deque实现,根据最大容量Capacity进行容量控制。个人理解它相当于应用层的输入输出缓存区,用户…...
建筑可视化中使用云渲染的几大理由
在建筑行业中,可视化技术已成为不可或缺的一部分。无论是设计方案的展示、施工进度的模拟,还是最终效果的呈现,建筑可视化都发挥着至关重要的作用。 建筑可视化是指通过计算机技术和图形学算法,将建筑设计、规划和施工过程中的数据…...
Python数据可视化-地图可视化
1.首先绘制实现数据可视化的思维导图 具体要实现什么功能-怎么处理,先把思路写好 数据来源: 爬取的数据 运行结果: 部分代码: 完整代码请在下方↓↓↓👇获取 转载请注明出处!...
leetcode 动态规划(基础版)单词拆分
题目: 题解: 一种可行的dp做法是基于完全背包问题,将s看成是一个背包,wordDict看作是物品,然后往s中放入物品判断最终是否可以变为给定的s即可。这道题和上一题都用到了在dp如何枚举连续子串和状态表示:枚…...
Ubuntu/Linux调试安装南京来可CAN卡
准备好USB rules文件和can driver文件备用! 必做:放置USB rules文件到对应位置处理权限问题 而后:安装内核driver并编译。需求众多依赖编译环境,视情况安装填补。如GCC,G,make等等 进入对应64bit文件夹中,添加权限,执…...
vue2+TS获取到数据后自动叫号写法
1.父组件写法 初始化: //引入子组件 <odialog ref"odialogRef" onSure"onSurea"></odialog> //子传父private onSurea() {// 初始化信息/重新叫号来的数据this.initTabelData()setTimeout(() > {// 播放声音的数据this.search…...
28、架构-边界:微服务的粒度
微服务的粒度 在设计微服务架构时,确定微服务的粒度是一个关键问题。粒度过大或过小都会带来不同的问题,因此需要找到合理的粒度来划分微服务。下面详细探讨微服务粒度的合理范围及其影响因素。 1. 微服务粒度的上下界 微服务的粒度不应该只有唯一正确…...
开源API网关-ApacheShenYu首次按照启动遇到的问题
一.背景 公司有API网关产品需求,希望有图形化的后台管理功能。看到了ApacheShenYu,作为Apache的顶级项目,直接认可了。首先,感谢各位大神的付出,初步看这个项目是国内大厂中的大神创立的,在此表示膜拜&…...
uniapp获取证书秘钥、Android App备案获取公钥、签名MD5值
一、 uniapp获取证书秘钥 打开uniapp开发者中心下载证书打开cmd输入以下这段代码,下载提供查看到的密钥证书密码就可以了!下载证书在 java 环境下运行才可以 // your_alias 换成 证书详情中的别名,your_keystore.keystore 改成自己的证书文件…...
QT 如何储存多种数据类型(QVariant )
QVariant 是 Qt 框架中用于存储各种数据类型的类。它提供了一个强大的类型系统,允许你在运行时存储和检索多种类型的数据,而不需要在编译时确定类型。QVariant 的主要优点在于它的灵活性和通用性,这使得它在 Qt 的很多组件和机制中都被广泛使…...
持续总结中!2024年面试必问的操作系统面试题(九)
上一篇地址:持续总结中!2024年面试必问的操作系统面试题(八)-CSDN博客 十七、解释什么是操作系统的安全性和它的重要性。 操作系统的安全性(Operating System Security)是指操作系统采取的一系列措施来保…...
操作系统入门 -- 文件管理
操作系统入门 – 文件管理 1.文件管理概述 1.1 文件系统基本功能 目前,计算机内存的容量依然有限,并且其特性决定了数据无法长时间保存,因此把执行的数据以文件形式保存在外存中,等到需要使用时再调入内存。所以,操…...
由浅入深,走进深度学习(2)
今天分享的学习内容主要就是神经网络里面的知识啦,用到的框架就是torch 在这里我也是对自己做一个学习记录,如果不符合大家的口味,大家划走就可以啦 可能没有什么文字或者原理上的讲解,基本上都是代码,但是我还是想说…...
【Python Tips】创建自己的函数包并安装进Anaconda,像引入标准包一样直接import导入
目录 一、引言 二、方法步骤 步骤一:创建包目录结构 步骤二:配置__init__.py文件 步骤三:文件夹外配置setup.py文件 步骤四:终端Pip安装 三、结尾 一、引言 在编写项目代码的时候,有些自定义功能的函数是可以复用的。…...
【Python机器学习实战】 | 基于支持向量机(Support Vector Machine, SVM)进行分类和回归任务分析
🎩 欢迎来到技术探索的奇幻世界👨💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…...
备份和还原
stai和dnta snat:源地址转换 内网---外网 内网ip转换成可以访问外网的ip 内网的多个主机可以使用一个有效的公网ip地址访问外部网络 DNAT:目的地址转发 外部用户,可以通过一个公网地址访问服务内部的私网服务。 私网的ip和公网ip做一个…...
Java数组的初始化方法
Java数组的初始化方法 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在Java编程中,数组是一种非常基础也非常重要的数据结构,它能够存储…...
通过分离有色和无色pdf页面减少打印费
前言 该工具是我认识的一位中科大的大佬在本科毕业的时候做的一个小工具,去打印店打印全彩的毕业论文的话会比较贵,他想到有没有一种方案可以实现有彩色页面的pdf和没有彩色页面的pdf分开打印,前者打印彩色,后者打印黑白…...
c语言--指针
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理c语言中指针的相关知识点。 指针概念 指针存储的就是数据的地址。 直观理解: 李华家是北洋路130号1单元101 用变量处理数据: 我们去李华家拿数据。 用指针处理数据: 我们去北洋路130号1单元101拿数据…...
Win11网络卡顿?用Wireshark抓包5分钟定位问题(保姆级实战)
Win11网络卡顿?用Wireshark抓包5分钟定位问题(保姆级实战) 最近在玩《英雄联盟》时,每次团战画面都会卡成PPT,Zoom视频会议也经常出现"机器人音效",作为IT工程师的我决定用Wireshark揪出真凶。没…...
腾讯地图API实战:5分钟搞定经纬度录入与地图选点功能(Vue版)
腾讯地图API实战:5分钟搞定经纬度录入与地图选点功能(Vue版) 在当今的Web开发中,地图功能已成为许多应用的标配需求。无论是电商平台的店铺定位,还是社交应用的位置分享,甚至是企业内部系统的区域管理&…...
Ostrakon-VL-8B智能代理(Agent)实践:自动化巡检餐厅后厨
Ostrakon-VL-8B智能代理实践:自动化巡检餐厅后厨 你有没有想过,如果餐厅后厨能有一个不知疲倦、眼力超群的“数字监工”,每天自动检查安全隐患和操作规范,那会是什么场景?过去,这可能需要一个经验丰富的厨…...
从供热管道泄漏模拟出发,聊聊Fluent中那些容易被忽略的‘粘性模型’选择细节
从供热管道泄漏模拟看Fluent粘性模型选择的工程智慧 供热管道泄漏事故的数值模拟一直是市政工程中的难点——当高温高压流体从破损处喷涌而出时,流动形态会经历从管道内湍流到自由射流的复杂转变。这种多尺度流动对湍流模型的选择提出了严苛考验,而大多数…...
OpenClaw自动化测试:百川2-13B驱动浏览器完成表单填写
OpenClaw自动化测试:百川2-13B驱动浏览器完成表单填写 1. 为什么选择OpenClaw做表单测试 去年我接手了一个需要频繁测试的Web项目,每次版本更新都要手动填写几十个表单字段。这种重复劳动不仅耗时,还容易因疲劳导致测试遗漏。当我发现OpenC…...
CSS图片轮播进阶:5种实现无限循环滚动的实战技巧(附完整代码)
CSS图片轮播进阶:5种实现无限循环滚动的实战技巧(附完整代码) 在电商网站的首页或个人作品集的展示页面中,图片轮播(Carousel)始终是吸引用户注意力的利器。而无限循环滚动效果,则能让有限的展示…...
uniapp日期处理全攻略:获取某月首尾日、近七天日期等实用技巧
Uniapp日期处理实战:从基础格式化到高级业务场景解决方案 在移动应用开发中,日期处理几乎贯穿所有业务场景。无论是电商平台的限时抢购、医疗应用的预约挂号,还是企业系统的报表统计,精准高效的日期操作都是保障业务逻辑完整性的关…...
保姆级教程:在QT中配置qcustomplot实现热力图(含常见问题解决方案)
QT中qcustomplot热力图实战:从配置到交互优化的完整指南 第一次在QT项目中尝试用qcustomplot绘制热力图时,我被数据映射和实时刷新的问题困扰了整整两天。直到凌晨三点调试通过的那一刻,才真正理解这个强大可视化工具的精妙之处。本文将分享那…...
ECG-Emotion Recognition(情绪识别)实战指南:WESAD与DREAMER数据集深度解析与应用
1. 情绪识别与ECG技术入门指南 第一次接触ECG情绪识别时,我和大多数人一样充满疑惑:心跳数据真能反映人的情绪?经过三个月的项目实践,我可以肯定地说,ECG信号就像情绪的"心电图",愤怒时心跳加速、…...
OpenClaw对接nanobot镜像:低成本实现本地AI助手自动化任务
OpenClaw对接nanobot镜像:低成本实现本地AI助手自动化任务 1. 为什么选择OpenClawnanobot组合 去年夏天,当我第一次尝试用AI自动化处理日常工作时,发现大多数方案要么需要昂贵的云服务API调用,要么对硬件要求极高。直到遇到Open…...
