STL 源码剖析:4、序列式容器


4.1 容器的概观与分类


常用的数据结构不外乎 array (数组)、list (链表)、tree (树)、stack (堆栈)、queue (队列)、hash table (散列表)、set (集合)、map (映射表) 等等。根据 “数据在容器中的排列” 特性,这些数据结构分为序列式 (sequence) 和关联式 (associative) 两种。

4.1.1 序列式容器

所谓序列式容器,其中的元素都可序,但未必有序。



4.2 vector


4.2.1 vector 概述

动态空间,随着元素的加入,它的内部机制会自定扩充空间以容纳新元素。

4.2.2 vector 定义摘要

4.2.3 vector 的迭代器

vector 维护的是一个连续线性空间,所以不论其元素型别为何,普通指针都可以作为 vector 的迭代器而满足所有必要条件。

4.2.4 vector 的数据结构

vector 以两个迭代器 start 和 finish 分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器 end_of_storage 指向整块连续空间的尾端。

4.2.5 vector 的构造与内存管理

4.2.6 vector 的元素操作



4.3 list


4.3.1 list 概述

list 的好处是每次插入或删除一个元素,就配置或释放一个元素空间。

4.3.2 list 的节点

4.3.3 list 的迭代器

list 的迭代器必须有能力指向 list 的节点,并有能力进行正确的递增、递减、取值、成员存取等操作。

4.3.4 list 的数据结构

SGI list 不仅是一个双向链表,而且还是一个环状双向链表。所以它只需要一个指针,便可以完整表现整个链表。

4.3.5 list 的构造与内存管理

4.3.6 list 的元素操作



4.4 deque


4.4.1 deque 概述

deque 是一种双向开口的连续线性空间。

所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作。

4.4.2 deque 的中控器

deque 采用一块所谓的 map 作为主控,其中每个元素都是指针,指向另一段连续线性空间。

4.4.3 deque 的迭代器

首先,它必须能够指出分段连续空间在哪里,其次它能够判断自己是否已经处于其所在缓冲区的边缘,如果是,一旦前进或后退时就必须跳跃至下一个或上一个缓冲区。

为了能够正确跳跃,deque 必须随时掌握管控中心。

4.4.4 deque 的数据结构

deque 除了维护一个先前说过的指向 map 的指针外,也维护 start,finish 两个迭代器。

4.4.5 deque 的构造与内存管理

4.4.6 deque 的元素操作



4.5 stack


4.5.1 stack 概述

stack 允许新增元素、移除元素、取得最顶端元素,但除了最顶端外,没有任何其他办法可以存取 stack 的其他元素。

4.5.2 stack 定义完整列表

deque 是双向开口的数据结构,若以 deque 为底部结构并封闭其头端开口,便轻而易举地形成了一个 stack。

4.5.3 stack 没有迭代器

stack 不提供遍历功能,也不提供迭代器。

4.5.4 以 list 作为 stack 的底层容器

若以 list 为底部结构并封闭其头端开口,一样能够轻而易举形成一个 stack。



4.6 queue


4.6.1 queue 概述

queue 允许新增元素、移除元素、从最底端加入元素、取得最顶端元素。但除了最底端可以加入,最顶端可以取出外,没有任何其他方法可以存取 queue 的其他元素。

4.6.2 queue 定义完整列表

deque 是双向开口的数据结构,若以 deque 为底部结构并封闭其底端出口和顶端入口,便轻而易举地形成了一个 queue。

4.6.3 queue 没有迭代器

queue 不提供遍历功能,也不提供迭代器。

4.6.4 以 list 作为 queue 的底层容器

若以 list 为底部结构并封闭某些接口,一样能够请以形成一个 queue。



4.7 heap


4.7.1 heap 概述

heap 并不属于 STL 容器组件,它是个幕后英雄,扮演 priority_queue 的助手。

4.7.2 heap 算法

4.7.3 heap 没有迭代器

heap 不提供遍历功能,也不提供迭代器。

4.7.4 heap 测试实例



4.8 priority_queue


4.8.1 priority_queue 概述

priority_queue 允许加入新元素、移除旧元素、审视元素值等操作。
由于这是一个 queue,所以只允许在底端加入元素,并从顶端去除元素,除此之外别无其它存取元素的途径。

4.8.2 priority_queue 定义完整列表

由于 priority_queue 完全以底部容器为依据,再加上 heap 处理规则,所以其实现非常简单,可以 vector 为底部容器。

4.8.3 priority_queue 没有迭代器

priority_queue 不提供遍历功能,也不提供迭代器

4.8.4 priority_queue 测试实例



4.9 slist


4.9.1 slist 概述

slist 的功能受到许多限制,但是所耗用的空间更小,某些操作更快,不失为另一种选择。

4.9.2 slist 的节点

slist 节点和迭代器的设计,架构上比 list 复杂许多,运用了继承关系,因此在型别转换上有复杂的表现。

4.9.3 slist 的迭代器

支持 ++,不支持 --。

两个 slist 迭代器是否等同,视其 __slist_node_base* node 是否等同而定。

4.9.4 slist 的数据结构

4.9.5 slist 的元素操作

猜你喜欢

转载自blog.csdn.net/qq_30534935/article/details/102861336