C++——STL容器
序列式容器:vector,list,deque;stack,queue(容器适配器),heap,priority_queue,slist
关联式容器:(底层都是红黑树)set,map,multiset,multimap,hashtable,hash_set,hash_map,hash_multiset,hash——multimap
综合对比:
| array | vector | list | deque | |
| 存储空间 | 静态 | 动态 | 动态 |
动态分段连续空间 (没用容量的概念) |
| 迭代器 | 普通指针+,-,++,--,+=,-=,->,* | 节点(向前指针,向后指针,数据) |
非普通指针,非常复杂 故非必要不要用deque |
|
| 数据结构 | 单向开口的线性连续空间(头部也可以插入,但操作效率低,无法接受) | 非连续空间,靠每个元素点的前后指针来串联起来——双向链表,甚至是双向环形链表 |
双向开口的线性连续空间(头尾均可插入、删除元素) star,finish两个迭代器, map指针, map大小 |
|
| 空间增加 |
1.原大小的2倍增加空间; 2.拷贝原空间内容并构造新元素 3.释放原空间 4.指向原vector的迭代器失效,要小心 |
插入一个元素,配置一个空间; 删除一个元素,释放一个空间 |
随时增加新的分段空间并连接起来 没有空间保留 |
|
| 任意位置插入数据 | 见下图1 | 插入,贴合,删除任意元素不会对其他元素/迭代器造成任何影响 | 操作复杂 |

选择原则:
1、如果你需要高效的随机存取,而不在乎插入和删除的效率,使用vector
2、如果你需要大量的插入和删除,而不关心随机存取,则应使用list
3、如果你需要随机存取,而且关心两端数据的插入和删除,则应使用deque。
4、如果你要存储一个数据字典,并要求方便地根据key找value,那么map是较好的选择
5、如果你要查找一个元素是否在某集合内存中,则使用set存储这个集合比较好
一、vector:简单,允许随机存储,数据的存取十分灵活,在缺省情况下应该使用。
二、deque:经常在头部和尾部安插和移除元素,并且存储的容量也比vector大得多。
三、list:如果经常在容器的中段执行安插,移除和移动元素。但是不支持随机存储。 list容器中尽量不要使用删除操作,比插入操作多消耗近百倍
四、set和multiset:经常以某个准则寻找元素,可以使用“以这个准则为排序准则”的set和multiset,在大量的数据情况下,对数复杂度比线性复杂度的效果要好的多。
五、map和multimap:使用(key、value)的pair,使用字典,使用关联式数组 e.g“map[key] = value”。
迭代器:类别、前进、后退、成员访问、取值dereference(*操作符)
1.序列式容器
1.1 vector

插入数据操作:



图1 Vector任意位置插入数据
①vector不适合push_front(效率很低)
②vector不适合中间插入删除操作。中间插入删除操作会引起内存拷贝。
1.2 list


list采用非线性的空间存储数据。
①list适合插入删除频繁的场所。不管插入还是删除,时间基本上都是常数。
②list不适合随机线性访问。
1.3 deque



deque采用类似文件系统的方式存储数据。其中有数个连续空间的缓冲区存储数据。这些缓冲区连接起来,给上层用户一个假象就是,存储的数据空间是连续的。
deque是list和vector的折中方案。兼有list的优点,也有vector随机线性访问效率高的优点。
①deque仍旧不适合中间插入删除操作。
②deque适合线性随机访问数据。
2.容器适配器
2.1 stack(栈,垛)先进,后出
1 继承自deque(封闭头部开口)——更像一个adapter而不是container

2 新增、移除、获得顶端数据,除此之外,无法获得其他数据。
3 没有迭代器
4 deque、list都可以作为底层容器
stack是deque的一种变种,优缺点不变。
2.2 queue(队列)

1 新增、移除,从尾端加入元素,从首端取出数据,此外,无法获得其他数据。不允许遍历
2 SGI STL 以deque为底部容器,封闭其前端入口和后端出口,前端只允许出,后端只允许入,即为queue
3 没有迭代器
4.queue是deque的一种变种,优缺点不变。
3.关联性容器
单旋转和双旋转操作:

对1和4用单旋转操作,2和3用双旋转操作
单旋转:

双旋转:

3.1 红黑树
规则:

1. 节点:颜色,父节点指针,左右节点指针,值
2. 迭代器:基本迭代器和继承的迭代器两层组成
3. 插入操作:1. 插入值:——对比节点键值(遇大往左,遇小往右)——得到新值的插入点、父节点——插入值(维护leftmost和rightmost,设定父节点、左右子节点)
2. 更新树:更改颜色,旋转树使其平衡
3.2 Set
1.元素的键值就是实值
2.值自动排序
3.不允许相同的值
4.底层是红黑树
3.3 map
1.所有的元素都是键值和实值的pair
2.不允许相同键值
3.键值自动排序
4.底层是红黑树
3.3 multiset
set(insert_unique)+允许键值重复:insert_equal
3.4 multimap
map(insert_unique)+允许键值重复:insert_equal
4.hashtable
参考:
原文:https://blog.csdn.net/u013299585/article/details/78323973
https://blog.csdn.net/caojunhao123/article/details/11907857
C++——STL容器的更多相关文章
- STL容器
啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...
- c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...
- STL容器删除元素的陷阱
今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:std::vector< ...
- 【转】c++中Vector等STL容器的自定义排序
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求: 1.Copy构造函数 2.赋值=操作符 3.能够销毁对象的析构函数 另外: 1. ...
- GDB打印STL容器内容
GDB调试不能打印stl容器内容,下载此文件,将之保存为~/.gdbinit就可以使用打印命令了. 打印list用plist命令,打印vector用pvector,依此类推. (gdb) pvecto ...
- STL容器迭代器失效分析
连续内存序列容器(vector, string, deque) 对于连续内存序列STL容器,例如vector,string,deque,删除当前iterator会使得后面所有的iterator都失效, ...
- STL容器的适用情况
转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...
- STL容器的遍历删除
STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的 ...
- STL容器与配接器
STL容器包括顺序容器.关联容器.无序关联容器 STL配接器包括容器配接器.函数配接器 顺序容器: vector 行为类似于数组,但可以根据要求 ...
- STL容器的本质
http://blog.sina.com.cn/s/blog_4d3a41f40100eof0.html 最近在学习unordered_map里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...
随机推荐
- PS基础教程[1]如何制作微信泡泡
PS是很多朋友都很喜欢额一款图像处理软件,我们可以使用PS制作很多的效果,本系列经验教程的起源就来源于知道中这位朋友问的微信泡泡如何使用,下面就来简单的分享一下. 微信泡泡制作方法 有很多的方法可以制 ...
- RabbitMQ学习系列四-EasyNetQ文档跟进式学习与实践
EasyNetQ文档跟进式学习与实践 https://www.cnblogs.com/DjlNet/p/7603554.html 这里可能有人要问了,为什么不使用官方的nuget包呐:RabbitMQ ...
- jenkins部署应用
1. 系统介绍 Jenkins系统提供了一键部署的作用,整个过程有从提测的分支抓取代码,编译,打包,把打的包部署在应用服务器上,基本有Service,Web和Worker等. 2. Jen ...
- WCF服务引用时错误: 无法导入 wsdl:portType详细信息
WCF服务发布到IIS后,在客户端或WCFTestClient添加引用的时候报错如下: 错误: 无法导入 wsdl:portType详细信息: 在运行 WSDL 导入扩展时引发异常: System.S ...
- 【spring源码学习】spring的AOP面向切面编程的实现解析
一:Advice(通知)(1)定义在连接点做什么,为切面增强提供织入接口.在spring aop中主要描述围绕方法调用而注入的切面行为.(2)spring定义了几个时刻织入增强行为的接口 => ...
- 1.2 java web的发展历史
前言 了解java web的发展历史和相关技术的演进历程,非常有助于加深对java web技术的理解和认识. 阅读目录 1.Servlet的出现 2.Jsp的出现 3.倡导了MVC思想的Servlet ...
- Linux性能评测工具之一:gprof篇介绍
转:http://blog.csdn.net/stanjiang2010/article/details/5655143 这些天自己试着对项目作一些压力测试和性能优化,也对用过的测试工具作一些总结,并 ...
- Object.prototype.hasOwnProperty()
hasOwnProperty() 方法会返回一个布尔值,指示对象是否具有指定的属性作为自身(不继承)属性. 语法 obj.hasOwnProperty(prop) 参数 prop 要检测的属性 字符 ...
- 洛谷 1514 (NOIp2010) 引水入城
题目:https://www.luogu.org/problemnew/show/P1514 如果有解,一个第一行的格子能覆盖第n行的一定是一个连续的区间. 因为如果不连续,则有围住了一些第n行的格子 ...
- 加载rocksdb实例报错:java.lang.UnsatisfiedLinkError: C:\Users\Administrator\AppData\Local\Temp\librocksdbjni3696928169151614297.dll
项目的缓存中用到了rocksdb,实例化时报错了: Related cause: org.springframework.beans.factory.BeanCreationException: Er ...