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
关联式容器
vector支持的操作:
vector维护的是一个线性连续空间,其迭代器是普通指针,vector支持随机存取。
vector以两个迭代器start和finish分别指向配置来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。
vector是动态空间,所谓动态增加大小,不是在原空间后接续新空间,而是以原空间大小的两倍另配置一块较大的空间,然后将原内容拷贝过来。
对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。
插入操作图示:
![](http://i.imgur.com/bYP3BOA.jpg)
![](http://i.imgur.com/sjS8E7K.jpg)
![](http://i.imgur.com/NiGpENw.jpg)
list不仅是双向链表,还是环状双向链表,使用一个node空白指针作为表头又作为end。
list支持的操作:
splice()、reverse()、merge()、sort()的实现都依赖于transfer(),它是非公开接口。
transfer的图示:
![](http://i.imgur.com/UVQBOB1.jpg)
deque采用一块所谓的map作为主控,map是一小块连续空间,其中每个元素都是指针,指向另一段较大的连续空间,称为缓冲区,缓冲区才是deque的存储空间主体。
![](http://i.imgur.com/4XPQLBL.jpg)
deque的中控器、迭代器、缓冲区的相互关系:
![](http://i.imgur.com/hbU5fTx.jpg)
缓冲区的末尾一定要有保留空间,而前端则可以没有。在无任何元素时,deque会保留一个缓冲区。
除了最顶端外,没有任何其他方法存取stack的元素,因此它不允许有遍历行为,无迭代器
stack以deque为底层结构,封闭deque头端开口。
支持的操作有
只能从最底端加入元素,从最顶端取出元素,没有其他方法存取queue的元素,因此不允许遍历,无迭代器
底层结构为deque,封闭deque的底端出口和前端入口。
支持的操作
二叉堆是一种完全二叉树,即除了底层叶结点外,其他节点都是满的,底层叶结点从左到右也没有空隙。
heap以vector来保存数据。
STL提供的是max-heap.
heap不提供遍历功能,无迭代器。
push_heap算法:将新元素放到最后,然后上溯到合适的位置以满足堆特性。
pop_heap算法:将根节点与最后一个节点交换,然后把新的根节点下溯到合适位置。
sort_heap算法:对每个值都进行pop_heap,每次都把最大值放到最后一个位子,就形成了从小到大的排序。
make_heap算法:就是堆排序算法,先使数据成为一个堆,再排序。
元素不是按照推入的顺序排列,而是按照权值排序
底层结构是max_heap。
支持操作
push()操作底层是先将元素push_back到vector末端,在push_heap排序。
pop()操作底层是先pop_heap(),在vector的尾部的值pop_back()。
slist的插入、移除、聚合等操作不会使原有的迭代器失效
因为STL插入元素是在原位置之前,而slist是单向的,要找到前一个元素只能重新遍历,因此insert、erase等操作属于不智之举。
slist不提供push_back(),只提供push_front(),元素次序和插入的次序相反.
提供的操作有:
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的所有迭代器就都失效了。
插入操作图示:
![](http://i.imgur.com/bYP3BOA.jpg)
![](http://i.imgur.com/sjS8E7K.jpg)
![](http://i.imgur.com/NiGpENw.jpg)
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的图示:
![](http://i.imgur.com/UVQBOB1.jpg)
4.4 deque
deque与vector的最大差异:一在于deque允许于常数时间内对起头端进行元素的插入或移除,二在于deque没有所谓的capacity概念,它是动态的以分段连续空间组合而成。deque采用一块所谓的map作为主控,map是一小块连续空间,其中每个元素都是指针,指向另一段较大的连续空间,称为缓冲区,缓冲区才是deque的存储空间主体。
![](http://i.imgur.com/4XPQLBL.jpg)
deque的中控器、迭代器、缓冲区的相互关系:
![](http://i.imgur.com/hbU5fTx.jpg)
缓冲区的末尾一定要有保留空间,而前端则可以没有。在无任何元素时,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源码剖析 笔记之四 序列式容器
- 《STL源码剖析》读书笔记——(2)序列式容器
- STL源码剖析 - 第4章 序列式容器 - list
- STL源码剖析 - 第4章 序列式容器 - priority_queue
- STL源码剖析 - 第4章 序列式容器 - heap
- 《STL源码剖析》学习笔记之三——序列式容器(list和vector)
- STL学习笔记——序列式容器list
- STL源码剖析 - 第4章 序列式容器 - vector
- 《STL源码剖析》读书笔记之序列式容器(3)
- 【STL源码剖析】序列式容器
- STL源码剖析 笔记之五 关联式容器
- STL源码笔记之序列式容器
- 《STL源码剖析》 第4章 序列式容器总结
- 《stl源码剖析》--序列式容器
- STL源码剖析_读书笔记:第四章 序列式容器 queue篇
- C++学习笔记(一) 序列式容器及适配器
- 插入容器STL学习笔记(八) 序列式容器 共性
- STL源码剖析_读书笔记:第四章 序列式容器 list篇
- STL源码剖析 - 第4章 序列式容器 - stack
- STL学习笔记--序列式容器