STL-学习笔记:顺序容器之deque

来源:互联网 发布:centos 安装bugzilla 编辑:程序博客网 时间:2024/05/29 17:24

vector 和 deque的区别?

1、vector是单向开口的连续线性空间,deque是一种双向开口的连续线性空间。

2、deque 允许常数时间内对头端进行元素的插入和删除操作。而vector在头端操作效率超级差。

3、deque没有容量观念。因为deque是动态地分段连续空间组合而成,随时可以增加一段新的空间并链接起来。


deque迭代器:并不是普通指针.


deque 基础知识。

deque 由一段一段的定量连续空间组成,采用一块所谓的map作为主控(并不是平时使用的map), map 是一小块连续的空间。deque 本身要维护指向map的指针,以及start,finish两个个迭代器,分别指向第一个缓冲区的第一个元素 和最后一个缓冲区的最后一个元素的下一个位置。

map中的每个节点是一个指针,指向一个特定大小的缓冲区,缓冲区里面存放的就是deque中的元素。在使用过程中,如果map提供的节点不足,就必须重新配置一块更大的map。


当deque调用push_back时,内部是怎样实现的?

如果当前的最后一个缓冲区的剩余备用空间大于一个元素时,则直接插入元素,当只剩一个元素的位置时,并且当前map的最后一个结点后面还有剩余的备用结点时,会先配置一整块新的缓冲区,map的下一个结点指向该缓冲区,插入新的元素, 最后更改finish的状态。


当调用push_front时,内部是如何实现的?

如果当前的第一个缓冲区前面有备用空间,就直接插入元素,与push_back不同的是,当没有任何备用空间时,才会冲刺你配置一整块新的缓冲区,并将map的已用结点前面的结点设置为指向新缓冲区的地址,新的元素放在新缓冲区的最后一个元素的位置上,最后更改start的状态。


以上两个方法都认为map的空间足够的情况,当map的空间已经不够时,要重新分配一个更大的,新的连续的空间作为新的map,并将旧map里面的内容全部复制到新的map中,同时更改start 和 finish,并将旧map的空间释放,然后再进行如上的push_back 和push_front 的相应内部操作。


当deque调用pop_back 和 pop_front时,要考虑在某种条件下,将一整块缓冲区全部释放掉。

当deque调用clear()时,由于deque的最初状态是仅有一个缓冲区,所以clear()之后,deque会恢复到最初的状态,即保留一个缓冲区。

注意:stack的内部是由deque实现的,只是更改了接口,形成另外一种风貌,就是“先进先出” 的栈式操作,所以stack没有迭代器,也不能对里面的所有元素进行遍历操作。

原创粉丝点击