STL容器分为序列式和关联式两种,序列式容器,其中的元素都可序,但未必有序
(heap内含一个vector,priority-queue内含一个heap,stack和queue都内含一个deque)
1.以vector为底层实现
1.1 vector vector详情
- vector维护的是一个连续线性空间,支持随机存取
- 在空间配置时,vector实际配置的大小可能比客户端需求量更大一些,以备将来可能的扩充
- vector动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,才开始在内容之后构造新元素,并释放原空间
1.2 heap
内含一个vector,不提供遍历功能,也不提供迭代器
相关知识:
- binary heap:一种complete binary tree(完全二叉树),除了最底层的叶节点之外,都是填满的,最底层的叶节点由左至右不得有空隙
- 根据元素排列方式分为:
- max-heap:每个节点的键值(key)都大于或等于其叶子节点键值(key)。最大值在其根节点,并总是位于底层vector或array的起头处
- min-heap:每个节点的键值(key)都小于或等于其叶子节点的键值(key)。最小值总是在其根节点,并位于的层vector或array的起头处
相关算法:
- push-heap算法
- pop-heap算法
- sort-heap算法
- make-heap算法
1.3 priority_queue
- 是一个拥有权值观念的queue
- 在缺省情况下利用max-heap完成
- 不提供遍历功能,不提供迭代器
2.以list为底层实现
2.1 list
- 每次插入或删除一个元素就配置或释放一个元素空间,对于任何位置的元素插入或元素删除,list永远是常数时间
- 不保证在储存空间中连续存在
- SGI list是一个环状双向链表
3.以slist为底层实现
3.1 slist
- 单向链表
- 迭代器属于单向的Forward Iterator
- 插入、删除和接合等操作不会造成原有的迭代器失效
- 插入操作会将新元素插入于指定位置之前
4.以deque为底层实现
4.1 deque
- 是由一段一段的定量连续空间构成
- 一旦有必要在deque的前端或尾端增加新空间,便配置一段定量连续空间,串接在整个deque的头端或尾端
- 采用一块所谓的map(一小块连续空间)作为主控。其中每个元素都是指针,指向另一段(较大的)连续线性空间(缓冲区)
4.2 stack
- 先进后出
- 只有一个出口
- SGI STL的stack在缺省情况下以deque作为底部结构
- 不提供走访功能,不提供迭代器
4.3 queue
- 先进先出
- 有两个出口
- 不允许有遍历行为
- SGI STL的queue在缺省情况下以deque作为底部结构