您的位置:首页 > 编程语言 > C语言/C++

STL源码剖析笔记-4序列式容器

2017-04-01 09:18 197 查看
序列式容器
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()等
.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stl 源码 c++