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拿数据…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
