deque是一种双向开口的连续线性空间
deque与vector的差别:
- deque允许常数时间内对头部进行插入和移除操作
- deque没有容量的概念,它是由多个分段连续空间组合而成的,可以随时增加一段新空间并链接起来
deque的数据结构
- deque采用了一块map作为主控,map上的每个元素都是一个指向一段线性连续空间的指针,除此之外,deque还维护了 start 和 finish 两个迭代器,分别指向第一个缓冲区的第一个元素和最后一个缓冲区的最后一个元素。
- deque的每个缓冲区都有三个迭代器,first、last和cur,分别指向缓冲区的头部、尾部和当前所在元素,缓冲区内部的操作将由这三个迭代器来完成。
deque的push_back操作
deque的结构相比vector要复杂不少,所以它的添加和删除操作也会变得复杂,这里以push_back()操作举例:
当我们在尾端添加一个元素的时候,它首先会判断 最后缓冲区是否有两个以上的元素备用空间 (头部则是会判断没有备用空间),如果有两个以上备用空间,那么我们可以直接讲元素放入缓冲区,但是若是没有,则会触发push_back_aux()函数。这个函数首先会判断 尾端的节点备用空间 ,如果不足,就会计算是否有足够的空间来配置新节点,它会判断 map的大小是否大于增加节点后大小的二倍,这将会决定map是否要重新配置一块新的空间给map使用。
在做好上面的操作以后,函数会配置一个新的节点,并将元素放入对应的缓冲区,改变finish的状态。
deque的clear操作
与其他的容器一样,deque也有clear()函数用来清除整个deque,但deque的最初状态会保有一个缓冲区,也就是说即使我们使用了clear()方法,deque一样会保留一个缓冲区
deque的insert操作
insert()函数可以支持我们在某一个位置插入一个值,但要注意的是,在某一个位置插入值的时候,函数会判断插入点前和插入点后的元素个数。当插入点前的元素个数比较少的时候,会在头部重新加入一个头部元素,然后将元素向前移动,反之,则会将尾端元素向后移动,最后在目标点插入新值。
stack与queue
stack(栈)是一种先进后出的数据结构,queue(队列)是一种先进先出的数据结构,在STL中,两者的底层结构都是基于deque实现的,它们是修改了deque的接口形成的,被称之为container adapter(容器配接器),而不是container(容器)