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拿数据…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...