STL源码剖析笔记-4序列式容器
来源:互联网 发布:windows 10激活 编辑:程序博客网 时间:2024/06/06 10:40
- 序列式容器
- 1 容器的概观与分类
- 2 vector
- 3 list
- 4 deque
- 5 stack
- 6 queue
- 7 heap
- 8 priority_queue
- 9 slist
4 序列式容器
4.1 容器的概观与分类
- 序列式容器
array、vector、heap、priority-queue、list、slist、deque、stack、queue
. - 关联式容器
RB-tree、set、map、multiset、multimap、hashtable、hash-set、hash_map、hash_multiset、hash_multimap
.
4.2 vector
- vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。
- vector支持的操作:
begin()、end()、size()、capicity()、empty()、operator[]、front()、back()、pop_back()、push_back()、erase()、resize()、clear()
. - vector维护的是一个线性连续空间,其迭代器是普通指针,vector支持随机存取。
- vector以两个迭代器start和finish分别指向配置来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。
- vector是动态空间,所谓动态增加大小,不是在原空间后接续新空间,而是以原空间大小的两倍另配置一块较大的空间,然后将原内容拷贝过来。
- 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。
- 插入操作图示:
4.3 list
- list的好处是每次插入或删除一个元素,就配置或释放一个元素的空间。因此list对于空间的运用有绝对的精准,而且对于任何位置的元素插入或元素移除,永远是常数时间。
- list不仅是双向链表,还是环状双向链表,使用一个node空白指针作为表头又作为end。
- list支持的操作:
push_front()、push_back()、erase()、pop_front()、pop_back()、clear()、remove()、unique()、splice()、reverse()、sort()、transfer()、merge()
. - splice()、reverse()、merge()、sort()的实现都依赖于transfer(),它是非公开接口。
- transfer的图示:
4.4 deque
- deque与vector的最大差异:一在于deque允许于常数时间内对起头端进行元素的插入或移除,二在于deque没有所谓的capacity概念,它是动态的以分段连续空间组合而成。
- deque采用一块所谓的map作为主控,map是一小块连续空间,其中每个元素都是指针,指向另一段较大的连续空间,称为缓冲区,缓冲区才是deque的存储空间主体。
- deque的中控器、迭代器、缓冲区的相互关系:
- 缓冲区的末尾一定要有保留空间,而前端则可以没有。在无任何元素时,deque会保留一个缓冲区。
4.5 stack
- stack 是一种先进后出的数据结构,只有一个出口
- 除了最顶端外,没有任何其他方法存取stack的元素,因此它不允许有遍历行为,无迭代器
- stack以deque为底层结构,封闭deque头端开口。
- 支持的操作有
empty()、size()、top()、push()、pop()
.
4.6 queue
- queue是一种先进先出的数据结构,有两个出口
- 只能从最底端加入元素,从最顶端取出元素,没有其他方法存取queue的元素,因此不允许遍历,无迭代器
- 底层结构为deque,封闭deque的底端出口和前端入口。
- 支持的操作
empty()、size()、front()、back()、push()、pop()
.
4.7 heap
- heap并不是STL的组件,而是优先队列的底层结构。
- 二叉堆是一种完全二叉树,即除了底层叶结点外,其他节点都是满的,底层叶结点从左到右也没有空隙。
- heap以vector来保存数据。
- STL提供的是max-heap.
- heap不提供遍历功能,无迭代器。
- push_heap算法:将新元素放到最后,然后上溯到合适的位置以满足堆特性。
- pop_heap算法:将根节点与最后一个节点交换,然后把新的根节点下溯到合适位置。
- sort_heap算法:对每个值都进行pop_heap,每次都把最大值放到最后一个位子,就形成了从小到大的排序。
- make_heap算法:就是堆排序算法,先使数据成为一个堆,再排序。
4.8 priority_queue
- 只允许底端加入元素,顶端取出元素,不能遍历,无迭代器
- 元素不是按照推入的顺序排列,而是按照权值排序
- 底层结构是max_heap。
- 支持操作
empty()、size()、top()、pop()、push()
- push()操作底层是先将元素push_back到vector末端,在push_heap排序。
- pop()操作底层是先pop_heap(),在vector的尾部的值pop_back()。
4.9 slist
- slist属于单向的Forward Iterator,list是双向的Bidirectional Iterator.
- slist的插入、移除、聚合等操作不会使原有的迭代器失效
- 因为STL插入元素是在原位置之前,而slist是单向的,要找到前一个元素只能重新遍历,因此insert、erase等操作属于不智之举。
- slist不提供push_back(),只提供push_front(),元素次序和插入的次序相反.
- 提供的操作有:
begin()、end()、size()、swap()、front()、push_front()、pop_front()、find()、insert()等
.
1 0
- STL源码剖析笔记-4序列式容器
- STL源码剖析 笔记之四 序列式容器
- STL源码剖析笔记(序列式容器)
- 《stl源码剖析》--序列式容器
- 【STL源码剖析】序列式容器
- 《STL源码剖析》 第4章 序列式容器总结
- STL源码剖析 - 第4章 序列式容器 - vector
- STL源码剖析 - 第4章 序列式容器 - list
- STL源码剖析 - 第4章 序列式容器 - deque
- STL源码剖析 - 第4章 序列式容器 - stack
- STL源码剖析 - 第4章 序列式容器 - queue
- STL源码剖析 - 第4章 序列式容器 - heap
- STL源码剖析 - 第4章 序列式容器 - priority_queue
- STL源码剖析 - 第4章 序列式容器 - ilist
- STL源码剖析: 第4章 序列式容器
- 《STL源码剖析》学习笔记-第4章 序列式容器
- 《STL源码剖析》学习笔记-第4章 序列式容器(二)
- 《STL源码剖析》-序列式容器(一)vector容器
- VS2015 编译QT项目出现error MSB6006: “cmd.exe”已退出,代码为 3。
- MapReduce处理xml文件(使用旧API)
- 为什么alert不弹出了?
- 机器学习之正则化(Regularization)
- OGG-01296 ORA-14402
- STL源码剖析笔记-4序列式容器
- java web error:Choose unique values for the 'webAppRootKey' context-param in your web.xml files
- 使用vue-awesome-swiper滑块插件
- 透明大页
- .NetCore1.1--CodeFirst创建数据库
- foreach 空指针(jdk1.7)
- 是否转专业?课程怎么办?
- 无法打开物理文件 XXX.mdf"。操作系统错误 5:"5(拒绝访问。)"的解决办法
- Android:motion事件