C++ STL 容器的一些总结

1 C++ STL类型及实现原理

1.1 顺序容器

容器中的元素为有序排列,可以指定元素插入位置.

1.1.1 vector

顺序存储, 初始化过程会分配一定量空间, 在尾部插入会很快, 但是在中间插入元素, 会把之后所有元素向后平移, 所以较慢(中间删除元素同理). 如果元素个数超过当前限制, 会重新分配更大空间, 再把原容器中所有元素都拷贝到新的容器中.

  • 优点: 支持随机访问(用下标访问), 性能较好
  • 缺点: 除了操作尾部元素, 增删中间元素性能较差

1.1.2 deque

同vector类似, 最大的好处是在头尾增删元素性能较好. 其元素存储在一组连续的内存中, 并在一个结构中存储这些内存追踪, 并不是像vector一样元素存在一块连续的内存中.

  • 优点: 支持随机访问(用下标访问), 增删首元素性能好于vector, 
  • 缺点: 随机访问性能不如vector, 增删性能不如list.

1.1.3 list

本质是双向链表, 增删元素速度较快, 但是并不支持用下标直接访问元素.

  • 优点: 首尾中间元素增删性能较好.
  • 缺点: 不支持随机访问.

1.2 关联容器

容器中的元素插入时无法指定其位置, 如果需要修改元素值时, 不可以直接修改, 需要先找到该元素并删掉, 再把所需的新元素插入. 其内部一般是通过红黑树实现的, 所以增删及查找操作性能较好.

1.2.1 set(multiset)和map(multimap)

内部元素为顺序排好的, set不允许存两个相同的元素, 而multiset同set相比允许存在相同的元素. ,map内部元素为pair<key, value>, 其内部是按照key进行排好序的. map不允许存两个相同key值的元素, 而multimap同map相比允许存在相同的key值的元素.

1.2.2 哈希容器 --- unordered_set和unordered_map

STL中基于哈希表原理(https://blog.csdn.net/Michael__Wu/article/details/110480600), 其中unordered_set和unordered_map都是用的开链法解决通过哈希函数获取的哈希地址相同的多个元素的存储问题.

C++ STL 无序容器存储状态示意图

图中的各个链表成为bucket(桶).

1.2.4 (multi)set/map与unordered_set/map对比

由于(multi)set/map的实现原理为红黑树, 所以其查找和增删元素的时间复杂度均为O(log(n)), 而unordered_set/map的实现原理为哈希表, 所以其查找和增删元素的时间复杂度均为O(1). 但是unordered_set/map所占用的内存更高, 且根据元素数量不同, 时间消耗也不一定小于(multi)set/map.

1.3 特殊容器(容器适配器)

在顺序容器的基础上实现, 屏蔽了部分功能, 增加了另一部分功能. 其中queue默认由deque实现, priority_queue默认由vector 实现。priority_queue 是“优先队列”。它和普通队列的区别在于,优先队列的队头元素总是最大的——即执行 pop 操作时,删除的总是最大的元素;执行 top 操作时,返回的是最大元素的引用。

1.3.1 stack

1.3.2 queue

1.3.3 priority_queue

1.4 string

2 接口类型

2.1 公共接口

所有的容器类都有以下接口:

int size(): 返回容器对象中所含有的元素的个数.

bool empty(): 返回容器对象是否为空.

2.2 顺序容器

2.3 关联容器

2.3.1 set & map

2.3.2 multiset & multimap

2.3.3 unordered_set & unordered_map

  • bucket_count()             返回当前容器底层存储键值(对)时,使用桶的数量。
  • max_bucket_count()    返回当前系统中,unordered_set(unordered_map)容器底层最多可以使用多少个桶。
  • bucket_size(n)             返回第 n 个桶中存储键值对的数量。
  • bucket(key)                  返回以 key 为键的键值对所在桶的编号。
  • load_factor()                返回 unordered_map 容器中当前的负载因子。(负载因子 = 容器存储的总键值对 / 桶数)
  • max_load_factor()       返回或者设置当前 unordered_map 容器的最大负载因子。
  • rehash(n)                     尝试重新调整桶的数量为等于或大于 n 的值。如果 n 大于当前容器使用的桶数,则该方法会是容器重新哈希,该容器新的桶数将等于或大于 n。反之,如果 n 的值小于当前容器使用的桶数,则调用此方法可能没有任何作用。
  • reserve(n)                    将容器使用的桶数(bucket_count() 方法的返回值)设置为最适合存储 n 个元素的桶数。
  • hash_function()           返回当前容器使用的哈希函数对象。

2.4 特殊容器(容器适配器)

2.4.1 取出一个元素

  • stack: 只能通过T & top();取到栈顶元素的引用
  • queue: 只能通过S.top()返回队头元素的引用
  • priority_queue: 同queue

2.4.2 插入一个元素

  • stack: 只能通过void push (const T & x);在栈顶放入元素
  • queue: 只能通过S.push()在队尾插入元素
  • priority_queue: 同queue

2.4.3 删除一个元素

  • stack: 只能通过void pop();弹出栈顶元素
  • queue: 只能通过S.pop()弹出队首元素
  • priority_queue: 同queue

3 迭代器(特殊容器: stack、queue 和 priority_queue 没有迭代器)

3.1 迭代器种类

  • 正向迭代器             容器类名::iterator  迭代器变量;(用的最多)
  • 常量正向迭代器      容器类名::const_iterator  迭代器变量;
  • 反向迭代器             容器类名::reverse_iterator  迭代器变量;
  • 常量反向迭代器      容器类名::const_reverse_iterator  迭代器变量;

3.2 用法

假如一个正向迭代器变量为iter.

  • *iter    取iter指向的元素
  • iter++ 指向下一个元素

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java电商项目简历_一文解析从写简历,到面试、谈薪酬技巧和防坑指南

点击上方“码农沉思录”&#xff0c;选择“设为星标”优质文章&#xff0c;及时送达读者大大们好&#xff0c;好几天没更新了。一方面因为这几天工作忙&#xff0c;占了写作的时间。另一方面是在准备这篇文章各种素材&#xff0c;今年是最难求职年&#xff0c;我希望通过这篇文…

qq浏览器极速版_安卓手机QQ轻聊版大升级,极速版正式上线:无广告/省内存

8月28日&#xff0c;安卓手机QQ极速版推出了4.0正式版&#xff0c;采用了全新的界面设计&#xff0c;仅保留了基本聊天功能和QQ空间、小程序、钱包、文件等少量QQ主推功能&#xff0c;现已开放下载&#xff0c;QQ极速版安装之后会覆盖QQ轻聊版。QQ极速版4.0界面焕新升级&#x…

C++ STL 容器 vector

1 vector简介 顺序存储, 初始化过程会分配一定量空间, 在尾部插入会很快, 但是在中间插入元素, 会把之后所有元素向后平移, 所以较慢(中间删除元素同理). 如果元素个数超过当前限制, 会重新分配更大空间, 再把原容器中所有元素都拷贝到新的容器中. 优点: 支持随机访问(用下标…

3dmax卸载工具_3dmax软件如何彻底卸载?

近期有很多学员遇到关于3dmax软件卸载的问题&#xff0c;有的是想安装更高版本但不知道如何卸载更安全&#xff0c;有的是自己卸载了之后再安装其他版本却总是无法成功&#xff0c;这对此类问题&#xff0c;今天我做一个详细讲解&#xff1b;根据自己所遇问题&#xff0c;找到最…

华为app安装失败与已安装签名_手机APP为什么总是安装失败

整天“机不离手”的我们每个人手机里都装有好几十个APP但安装的时候总会出现跳出手机APP无法安装或安装失败的页面这究竟是怎么回事呢&#xff1f;小翼带你瞅瞅一、手机安全认证在安装或下载应用程序时&#xff0c;如果提示失败可能是因为系统“未知来源”没有开启。可以通过打…

C++ STL 中提供的算法

1 算法 1.1 for_each() 参数有三个: 首迭代器尾迭代器执行的函数 例如如下代码: #include <algorithm> //必须包含 #include <vector> using namespace std;int main() {vector<int> tmp;tmp.push_back(10);tmp.push_back(20);tmp.push_back(30);tmp.pu…

arma模型_GARCH模型应用:以国泰君安为例

1.下载国泰君安股票数据&#xff0c;计算对数收益率(1)首先安装包"quantmod"&#xff0c;这个包可以从雅虎财经的下载股票数据&#xff0c;具体包的解释见"【量化基础】R语言获取金融数据之quantmod包"。install.packages("quantmod")#安装包qua…

C++ STL 容器 string

1 string string内部含有一个char*字符串 2 string构造方式 无参构造 string str; 字符串构造 string str("abcd"); 拷贝构造n个相同字符 string str(10, k); //初始化为10个k 3 string赋值操作 可以有以下操作: void string_test() {string str1;str1 &qu…

小程序webview不全屏_小程序不在小(深度)

原标题&#xff1a;小程序不在小(深度)你问&#xff1a;“微信小程序适合哪些行业?”&#xff0c;回答是&#xff1a;“所有行业!”你可以想一下那些做过APP的公司&#xff0c;不管是任何行业的公司都可以拥有属于自己的APP&#xff0c;而从来不会有人问他们你们用的APP是否适…

leetcode 4 --- 寻找两个有序数组的中位数

1 题目 给定两个大小为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。 进阶&#xff1a;设计一个时间复杂度为 O(log (mn)) 的算法. 2 解法 这个题如果mn是偶数, 就是找到第(mn)/2以及第(mn)/2 1个数, 如果…

leetcode 142 --- linked-list-cycle-ii

1 题目&#xff1a; 对于一个给定的链表&#xff0c;返回环的入口节点&#xff0c;如果没有环&#xff0c;返回null 拓展&#xff1a; 你能给出不利用额外空间的解法么&#xff1f; 代码&#xff1a; class Solution { public:ListNode *detectCycle(ListNode *head) {} …

百度搜索引擎优化指南3.0_深圳网站搜索引擎排名优化电话,百度优化排名费用_华阳网络...

天津华阳在线科技有限公司为您详细解读深圳网站搜索引擎排名优化电话,百度优化排名费用的相关知识与详情&#xff1a;网站的主页标题是百度SEO的关键。你想要的主要关键词应该反映在标题中。如果标题写得好&#xff0c;百度很快就收录进去了。但要记住&#xff0c;有一点&#…

C++ STL 容器的一些总结 --- set(multiset)和map(multimap)

1 set和multiset 1.1 插入元素方式 set只能用insert插入数据. insert返回值是一个pair<iterator, bool>, 即插入数据的迭代器以及是否插入成功, multiset返回的只有迭代器, 因为不会插入失败. 1.2 删除 set只能用erase, 可以传迭代器或者是值. 1.3 注意事项 不允许…

苹果自带相册打马赛克_剪映app怎么给视频局部打马赛克

剪映app怎么给视频局部打马赛克呢&#xff1f;很多用户对此还不是很清楚&#xff0c;小编这里就给大家带来有关剪映app怎么给视频局部打马赛克的回答&#xff0c;希望能够对大家有所帮助。1、首先打开剪映app&#xff0c;进入首页后点击开始创作选项&#xff0c;2、这时选择需要…

excel表格如何转换成word表格_如何将excel转换成pdf?excel表格可以变成pdf文件吗?...

文字使用word&#xff0c;数据使用Excel&#xff0c;这应该是咱们日常生活中的一个规律了吧&#xff1f;不过不管是word文档还是Excel文档&#xff0c;都是可以被编辑修改的&#xff0c;那么我们怎么才能让它变得不能被编辑修改呢&#xff1f;小编这里还真有一个好方法&#xf…

python车牌识别系统开源代码_天津谁做车牌识别系统供应商,伸缩栅栏门_郑州荣锋科技有限公司...

首页 > 新闻中心发布时间&#xff1a;2020-11-13 22:54:57 导读&#xff1a;郑州荣锋科技有限公司为您提供天津谁做车牌识别系统供应商,伸缩栅栏门的相关知识与详情&#xff1a; (1)门处于关闭状态&#xff0c;控制器应骆动执行电机以佳速度曲线打开门;圆弧形自动门卷帘门机…

收发一体超声波测距离传感器模块_一文了解超声波液位计

为什么选择超声波液位计&#xff1f;因为&#xff0c;超声波液位计由声波的发射和接收之间的时间来计算传感器到被测物体的距离。无机械可动部分&#xff0c;可靠性高&#xff0c;安装简单、方便&#xff0c;属于非接触测量&#xff0c;且不受液体的粘度、密度等影响精度比较低…

什么牌子的平板电脑好_平板电脑什么牌子好?带你一探年度最佳平板的奥秘

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以免费收到最新内容了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。声明&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系…

ieee754浮点数转换工具_关于JS浮点数运算不精确的原因和解决方案

背景之前在一个项目中&#xff0c;涉及到了金额&#xff0c;协议组定的标准是按照分的单位进行传递的&#xff0c;但是交互上&#xff0c;web页面中为了更友好的体验&#xff0c;是使用的元作为单位的&#xff0c;这个时候就需要转换一下单位本来是很简单的一个转化的需求&…

fir滤波器matlab实现_关于FIRamp;IIR系统的算法说明以及结果验证(1)

首先&#xff0c;做一个简短的开场白。本贴主要是一个关于信号处理方面的学习笔记。主要目的有三&#xff0c;作为研究笔记留存分享我个人的理解与专业人士进行意见交换另外由于楼主不是教课员&#xff0c;因此无法保证算法分析以及个人理解的完全正确性&#xff0c;若本人对知…