网站制作价格和流程/商城小程序
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拿数据…...

python-九九乘法表(对齐式1)
[题目描述] 输出九九乘法表,输出格式见样例。输入格式: 无输出格式: 输出乘法表,对齐方式见样例输出。样例输入 无样例输出 来源/分类(难度系数:一星) 完整代码展示: #对齐式1 a[] …...

thinkphp单独为某个接口设置缓存
参考 官方文档 $this->request->cache(__URL__,600);只需要在接口方法的开头添加这个代码即可...

OpenCV视觉--视频人脸微笑检测(超详细,附带检测资源)
目录 概述 具体实现 1.加载分类器 2.打开摄像头并识别人脸 3.处理人脸并检测是否微笑 效果 总结 概述 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,广泛应用于图像处理和视频分析等领…...

docker 搭建 AI大数据模型 --- 使用GPU
docker 搭建 AI大数据模型 — 使用GPU方式 搭建本地大模型,最简单的方法!效果直逼GPT 服务器GPU系统HP580 G8P40Rocky9.2 安装程序AnythingLLM前端界面Open WebUIChatOllamaollama 一、AnythingLLM 介绍 AnythingLLM 是 Mintplex Labs Inc. 开发的一…...

面向对象, 常用类, 集合, 异常, JDBC, mysql数据库 复习
1.面向对象 (1)面向过程和面向对象 ● 面向过程的程序设计思想 (procedure -Oriented Programming),简称POP ● 关注的焦点是过程:过程就是操作数据的步骤。如果某个过程的实现代码重复出 现,那么就可…...

js取数组最大值之Math.max、Math.max.apply
js取数组最大值之Math.max、Math.max.apply Math.maxMath.max.applyapply()第一个参数为什么可以是null 最小值同理 Math.max Math.max(n1,n2,n3,…,nX) 支持传递多个参数,带有较大的值的那个数 Math.max(2,5,3,6,2,4,2,15,9,6,0,1)Math.max.apply apply() 语法&a…...

各种中间件的安装
文章目录 20232306mysql的wondows安装 2023 2306 mysql的wondows安装 常用mysql教程 springboot整合druid连接池SpringBoot配置Druid连接池 mysql的wondows安装 MySQL学习笔记 01、MySQL安装 这个是安装的具体思路 win10 安装 mysql 5.7 msi版的教程图文详解 这个是安装的…...

【Mysql】多表查询、隐式内链接、显式内连接、左外连接、右外连接
多表查询 什么是多表查询 •DQL: 查询多张表,获取到需要的数据 •比如 我们要查询家电分类下 都有哪些商品,那么我们就需要查询分类与商品这两张表 数据准备 创建db3_2 数据库 -- 创建 db3_2 数据库,指定编码 CREATE DATABASE db3_2 CHARACTER SET utf8;创建分类表与商品表 …...

Linux驱动开发(三)--新字符设备驱动开发 LED驱动开发升级
1、新字符设备驱动原理 使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可,但是这样会 带来两个问题 需要我们事先确定好哪些主设备号没有使用 会将一个主设备号下的所有次设备号都使用掉,比如现在设置 LED 这个主设备号为200&…...

MCU的最佳存储方案CS创世 SD NAND
大家都知道MCU是一种"麻雀"虽小,却"五脏俱全"的主控。它的应用领域非常广泛,小到手机手表,大到航空航天的设备上都会用到MCU.市面上目前几个主流厂商有意法半导体(其中最经典的一款就是STM32系列)…...