容器:
序列式容器:
- array: C++ 内建
- vector: 动态连续空间,迭代器为普通指针
- heap: 用array存储
- priority-queue: 利用max-heap完成
- heap: 用array存储
- list: 双向环形链表存储,只要一个指针,便可表示整个环状双向链表。
- slist: 单项链表(single linked list)。和list的主要差别在于slist的迭代器属于单向的Forward Iterator,list的迭代器属于双向的Bidirectional Iterator。
- deque: vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。
- stack: 可以deque为底部结构并封闭其头端开口,形成stack。也可以list为底部结构形成stack。因此STL stack往往不被归类为container,而被归类为container adapter。
- queue: 以deque为底部结构并封闭其底端的出口和前端的入口,形成queue。因此STL queue往往不被归类为container,而被归类为container adapter。
deque
与vector相比,deque允许常数时间内对起头端进行元素的插入或移除操作,且没有所谓容量(capacity)观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。像vector那样“因旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在deque是不会发生的。也因此,deque没有必要提供所谓的空间保留(reserve)功能。
虽然deque也提供Random Access Iterator,但它不是普通指针,比vector要复杂许多。这影响了各个运算层面。因此,除非必要,我们应尽可能选择使用vector而非deque。对deque进行的排序操作,为了最高效率,可以将deque先复制到一个vector身上,将vector排序后(利用STL sort算法),再复制回deque。
deque系由一段一段的定量连续空间构成。一旦有必要在deque的前端或尾端增加新空间,便配置一段定量连续空间,串接在整个deque的头端或尾端。deque的最大任务,便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随机存取的接口。避开了“重新配置、复制、释放”的轮回,代价则是复杂的迭代器架构。
关联式容器
- RB-tree
- set
- map
- multiset
- multiset
- hashtable
- hash_set
- hash_map
- hash_multiset
- hash_multimap