深入解析C++ STL中的常用容器

C++ STL命令手册 set总结 insert(key_value);将key_value插入到set中,返回值是pair< set< int>::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。 inset(first,second);将定位器first到... 阅读详情
这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)

STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用。下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)。

1、顺序性容器

(1)vector
vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2的倍数动态增长的,即内存空间增长是按照20,21,22,23.....增长的,在push_back的过程中,若发现分配的内存空间不足,则重新分配一段连续的内存空间,其大小是现在连续空间的2倍,再将原先空间中的元素复制到新的空间中,性能消耗比较大,尤其是当元素是非内部数据时(非内部数据往往构造及拷贝构造函数相当复杂)。vector的另一个常见的问题就是clear操作。clear函数只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越多,导致内存泄露,现在经常用的方法是swap函数来进行解决: 

复制代码代码如下:

vector<int> V;
V.push_back(1); 
V.push_back(2);
V.push_back(1); 
V.push_back(2);
vector<int>().swap(V); 
//或者 V.swap(vector<int>());

利用swap函数,和临时对象交换,使V对象的内存为临时对象的内存,而临时对象的内存为V对象的内存。交换以后,临时对象消失,释放内存。

(2)deque
deque和vector类似,支持快速随机访问。二者最大的区别在于,vector只能在末端插入数据,而deque支持双端插入数据。deque的内存空间分布是小片的连续,小片间用链表相连,实际上内部有一个map的指针。deque空间的重新分配要比vector快,重新分配空间后,原有的元素是不需要拷贝的。

(3)list
list是一个双向链表,因此它的内存空间是可以不连续的,通过指针来进行数据的访问,这使list的随机存储变得非常低效,因此list没有提供[]操作符的重载。但list可以很好地支持任意地方的插入和删除,只需移动相应的指针即可。

(4)在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
1) 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2) 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3) 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

2、关联容器

(1)map
map是一种关联容器,该容器用唯一的关键字来映射相应的值,即具有key-value功能。map内部自建一棵红黑树(一种自平衡二叉树),这棵树具有数据自动排序的功能,所以在map内部所有的数据都是有序的,以二叉树的形式进行组织。

这是map的模板:
template < class Key, class T, class Compare= less<Key>, class Allocator=allocator< pair<const Key,T> > > class map;

从模板中我们可以看出,再构造map时,是按照一定的顺序进行的。map的插入和删除效率比其他序列的容器高,因为对关联容器来说,不需要做内存的拷贝和移动,只是指针的移动。由于map的每个数据对应红黑树上的一个节点,这个节点在不保存你的数据时,是占用16个字节的,一个父节点指针,左右孩子指针,还有一个枚举值(标示红黑色),所以map的其中的一个缺点就是比较占用内存空间。

(2)set
set也是一种关联性容器,它同map一样,底层使用红黑树实现,插入删除操作时仅仅移动指针即可,不涉及内存的移动和拷贝,所以效率比较高。set中的元素都是唯一的,而且默认情况下会对元素进行升序排列。所以在set中,不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,再插入新元素。不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取。

set模板原型:
template <class Key, class Compare=class<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) > class set;

set支持集合的交(set_intersection)、差(set_difference)、并(set_union)及对称差(set_symmetric_difference) 等一些集合上的操作。

3、容器适配器

(1)queue
queue是一个队列,实现先进先出功能,queue不是标准的STL容器,却以标准的STL容器为基础。queue是在deque的基础上封装的。之所以选择deque而不选择vector是因为deque在删除元素的时候释放空间,同时在重新申请空间的时候无需拷贝所有元素。

其模板为:
template < TYPENAME _Sequence="deque<_TP" typeneam _Tp,> > class queue;

(2)stack
stack是实现先进后出的功能,和queue一样,也是内部封装了deque,这也是为啥称为容器适配器的原因吧(纯属猜测)。自己不直接维护被控序列的模板类,而是它存储的容器对象来为它实现所有的功能。stack的源代码原理和实现方式均跟queue相同。

STL中有哪几种容器  C++ 之高效使用STL (STL 容器的选择) : 你知道C++中有很多你可以支配的容器,但是你意识到有多少吗?要确定你没有忽略你的选项,这里有一个快速回顾。 •标准STL序列容器:vector、string、deque和list。 •标准STL关联容器:set、multiset、map和multimap。 •非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符串。(“绳子(rope)”是重型的“线(string)”。明白了吗?)你可以找到一个关于这些非标准(但常见 阅读详情

相关推荐

c++STL常用容器之Stack容器——全面总结(附案例解析)(十四)

这里有C++STL——全面总结详细教程(附案例解析)(持续更新中) 目录 stack容器 stack 基本概念 stack 常用接口 stack容器 stack 基本概念 概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为 栈中进入数据称为 --...

cfl997 8140

c++容器比较以及用法

顺序性容器: 顺序性容器 高效率 低效率 操作 vector 查找 插入、删除 push_back(),pop_back() list 插入、删除 查找 push_back(),pop_back() ,push_front(),pop_front() deque 两段元素的删除插入   push_back(),pop_

fffupeng的博客 507

电子技术设计——16×16点阵汉字显示设计

同时,设计还应注重提升显示品质,以保证汉字的稳定展示和观感舒适。本设计的目的是构建一个能够准确在LED点阵上展示汉字的系统,并允许用户通过输入设备来选择所需的汉字,我们将验证设计方案的实际操作性和效果,以确保其满足设计目标。在LED点阵显示和汉字信息处理技术的结合下,研究者们着手研究如何在LED点阵上有效地显示汉字,并提出了一系列显示算法和优化策略,旨在实现清晰且易于阅读的汉字显示效果。首先,你需要准备16×16的LED点阵面板,通常这些点阵是8×8点阵的两倍,因此可以由两个8×8的点阵组合而成。

weixin_68094467的博客 1532

C++各个容器比较(vector,deque,list,set,map,queue,stack)

一: 标准库定义了三种顺序容器类型:vector、list 和 deque(是双端队列“double-ended queue”的简写,发音为“deck”)。 顺序容器适配器包括 stack、queue 和 priority_queue 类型,见表。 顺序容器 vector 支持快速随机访问 list 支持快速插入/删除 deque 双端队列 顺序容器适配器 stack 后进

longlovefilm的博客 2333

(ZOS-API)Matlab控制ZEMAX软件调整光学系统某镜面位姿

所用软件的版本:MatlabR2022a, Zemax OpticStudio2024R1交互扩展功能,Zemax和可以同时打开,操作会比较方便在ZEMAX软件中,调整次镜位置通常有两种方法:1.在次镜前后各添加一个坐标间断面,并修改其“偏心X”“偏心Y”等参数来调整次镜的位姿;2.或者直接在次镜属性选项中设置相关数值。这两种方法对Zernike系数的采集结果无显著影响。

ecilifurt的博客 911

WPS JS宏实战:批量调整200个Word表格格式的避坑指南(附完整代码)

本文提供了一份详尽的WPS JS宏实战指南,针对批量调整大量Word表格格式的需求。文章深入解析了如何利用JS宏自动化设置字体、行距和边框,并重点解决了常见的“首行访问报错”等核心难题,附有可直接使用的完整代码,帮助用户显著提升文档处理效率。

weixin_29280219的博客 428

java stl容器_深入解析C++ STL中的常用容器

STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用。下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)。1、顺序性容器(1)vectorvector是一种动态数组,在内存中具...

weixin_39842617的博客 264

STM32H743+YT8512C以太网通信实战:CubeMX与LWIP配置详解

本文详细解析了基于STM32H743微控制器与YT8512C PHY芯片的以太网通信实战方案。通过CubeMX工具进行RMII接口、MPU、时钟树等关键硬件配置,并重点阐述了如何修改LWIP协议栈驱动代码以适配YT8512C芯片,解决了LAN8742驱动不兼容的问题。文章提供了从工程创建、代码适配到调试验证的完整步骤,帮助开发者快速实现稳定可靠的嵌入式网络连接。

weixin_29190573的博客 558

C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程

C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(std::vector、std::array、std::list、std::deque)、关联容器(std::set、std::map)和无序容器(std::unordered_set、std:

平凡程序猿~的博客 7970

如何用capl操控程控电源(RS232)

capl脚本操控RS232

xiaohuanxiong_的博客 3990

保姆级教程:用PyTorch从零实现SDE扩散模型(附完整代码与MNIST实战)

本文提供了一份详细的PyTorch教程,指导读者从零开始实现SDE扩散模型,并附有完整的代码示例和MNIST数据集实战。通过解释随机微分方程(SDE)的核心概念、模型架构设计、训练流程实现以及采样生成过程,帮助开发者掌握扩散模型的构建与应用。

weixin_28677005的博客 263

C++之STL容器学习总结

文章目录1.STL容器简介1.1STL介绍1.2容器分类2.向量vector2.1定义和初始化2.2常用操作2.3遍历操作3.列表list3.1定义和初始化3.2常用操作3.3遍历操作3.4实例程序4.双端队列deque4.1定义和初始化4.2常用操作4.3实例操作5.集合set5.1定义和初始化5.3常用操作5.4遍历操作5.5实例操作 1.STL容器简介 1.1STL介绍 STL是什么?STL...

蒋成的博客 4117

如何使用 ESP32 CAM 进行自动车牌识别 (ANPR)

用于提取 JSON 值并在 OLED 上显示文本的函数。有一个可用的函数,即 extractJsonStringValue 来提取字符串值。它是独立函数,但您仍然可以使用一些 JSON 库来执行相同的功能。

jkh920184196的博客 1303

C++ stl容器详解

​ 上面这个定义其实相当于是一维数组name[SIZE],只不过,其长度可以根据需要进行变化,比较节省空间,说通俗了就是“变长数组”。​ 和一维数组一样,这里的 typename 可以是任何基本类型,例如 int、double、char、结构体等,也可以是STL标准容器,例如vector、set、queue等。需要注意的是,如果typename也是一个STL容器,定义的时候要记得在 >> 符号之间加上空格,因为一些使用C++11之前标准的编译器会把它视为移位操作,导致编译错误。

Eliauk-GX的博客 825

【银河麒麟桌面系统】自定义ISO镜像操作实践

本文详细介绍了麒麟操作系统Kylin-Desktop-V10-SP1的ISO镜像定制流程。通过挂载原始镜像、解压文件系统、进入chroot环境进行系统定制(包括文件替换和软件管理),最终重构squashfs并生成新ISO。关键步骤包括:挂载镜像到mnt目录、解压filesystem.squashfs、替换源配置文件、在chroot环境中清理系统、重新生成squashfs文件以及使用mkisofs命令创建新镜像。文章特别标注了x86和ARM架构的不同命令参数,并提供了安装测试验证方法。整个过程展示了从原始镜像

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2339

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++ STL 标准模板库(容器总结)算法

C++ 标准模板库STL,是一个使用模板技术实现的通用程序库,该库由容器container,算法algorithm,迭代器iterator,容器和算法之间通过迭代器进行无缝连接,其中所包含的数据结构都是目前最优解,该库既能保证软件代码的高可复用性,又能保证代码具有相当高的执行效

微软技术分享 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STL — 常用容器

2 STL — 常用容器 2.1 string容器 2.1.1 string基本概念 本质: string是C++风格的字符串,而string本质上是一个类 string和char 的区别:* char* 是一个指针 string是一个类,类内部封装了char* ,管理这个字符串,是一个char*型的容器 特点: string类内部封装了很多成员方法 例如:查找find,拷贝copy,删除delete替换replace,插入insert string管理char*所分配的内存,不用担心复制越界和取

weixin_50560109的博客 2355

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C++】set的常用用法总结

一、概念 set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。 set顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_s...

ColorGalaxy 4868

C++STL-八股文

迭代器失效是指容器被修改后,旧的迭代器/指针/引用不再有效。连续存储()在扩容或中间插入/删除会使大量迭代器失效;节点式容器(插入一般不失效erase只使被删元素失效;哈希容器在rehash时会使全部迭代器失效。用erase返回值继续遍历reserve预容量、修改后重新获取迭代器、必要时选用迭代器稳定的容器。

2301_79989083的博客 1298

C++ STL 容器与算法全解析:从底层原理到实战优化

vector是动态数组,使用连续的内存空间存储元素,支持快速随机访问。当存储空间不足时,会自动分配更大的内存块,并将所有元素复制过去。list是双向链表,每个元素包含数据和两个指针(前驱和后继),元素在内存中不连续存储。deque(双端队列)是一种双向开口的连续线性空间,可以高效地在头尾两端插入和删除元素。它由多个连续的内存块组成,内部维护一个指向这些块的指针数组。map是键值对(key-value)的集合,其中每个键(key)都是唯一的。map中的元素按照键的大小进行排序(默认升序),通常使用红黑树实现。

qq_28450045的博客 752
上一篇: C++11之future,promise,packaged_task,async详解
下一篇: STL中容器的使用全面总结
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值