首页 > 代码库 > 【C++】STL容器归纳总结(一)顺序容器
【C++】STL容器归纳总结(一)顺序容器
顺序容器:
顺序容器包括:vector、deque、list、forward_list、array以及string
vector:可变大小数组,即将元素保存在一段连续的内存空间中。支持快速随机访问。在尾部之外的位置插入删除元素可能会很慢。
PS:当元素已经占满了预先分配的内存空间,插入新的元素时,开辟一段新的内存空间,大小为之前vector的两倍,再将vector内的元素拷贝到新的内存空间内。
vector的插入删除操作会造成迭代器的失效
list:双向链表。只支持双向顺序访问。在list任何位置进行插入、删除都很快。
注意几个函数:
splice 将1个list的一段连续数据接在另一个list的某个位置之前
merge、sort(使用的是快排)
deque:双向队列,双端开口的连续空间(逻辑上看来是这样的,但并不是vector那样的线性连续空间)。在头尾位置插入删除数据很快。
deque与vector的差异:
1.deque允许常数时间内对头端进行数据的插入或删除。
2.deque没有所谓的容量观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。
deque的实现原理:
deque实际上由一段一段的定量连续空间链接构成,一旦有必要在deque的头部或尾部增加新的空间,便配置一段定量连续空间,串接在整个deque的头端或尾端。
因此deque必须要有一个中央控制组件来维护整体连续的假象并提供随机存取的接口。
deque采用一小块连续空间称为所谓的“map”,“map”内的每一个元素都是指针,指向另一段较大的连续内存空间,被称为缓冲区,缓冲区既是deque存储空间的主体。
如何维持“整体连续“的假象?
通过对deque的迭代器的operator++与operator--的重载来实现。
通过源码可以看到deque的迭代器类内有这么几个成员
T* cur; 此迭代器所指缓冲区中的现行元素
T* first; 此迭代器所指缓冲区中的头
T* last; 此迭代器所指缓冲区中的尾
map_point node; 指向“map”中对应的元素
stack
stack是以deque或list为底部结构,并将其接口改变,以符合“先进后出”的特性来实现的。严格来说不算STL容器中的一类,STL把这种称为container adapter。
PS:stack没有迭代器
queue
queue与stack同理。
顺序容器还有
forward_list 单向链表
string 与vector相似的容器,专门用于保存字符。
【C++】STL容器归纳总结(一)顺序容器