双端队列是动态大小的序列式容器,其可以像两端进行伸缩。
特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高效。与vector不同的是,deque不能保证所有的元素存储在连续的空间中,在deque中通过指针加偏移量方式访问元素可能会导致非法的操作。vector与list提供了相似的接口,因此其具有类似的用途,但是内部的实现原理不同:vector使用使用了动态数组,该数组通常需要动态增长;deque中的元素可能分散在不同的存储块中,在deque中保存了一些必要的信息,通常用来在常数范围内直接访问deque中的任何一个元素,所以deque的内部实现比vector复杂,但是这些额外信息使得deque在某些情况下增长更加的高效,特别是在序列比较大,重新分配成本比较高的情况下。除了在频繁在头部或尾部进行插入和删除操作外,deque比list和forward_list的性能更差。
双端队列中实际上是一个vector,这个vector中的元素都是指针,而指针指向的地方,才是真正存放数据的地方。
deque的迭代器
cur:指向当前访问的元素
first:指向当前数据存在的缓冲区的首地址
last:指向当前数据存在的缓冲区的末尾
node:指向容器中的某一节点,表示该迭代器属于某一指针的
与vector比较
deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不 需要搬移大量的元素,因此其效率是必vector高的。
与list比较
deque的优势是:其底层是连续空间,空间利用率比较高,不需要存储额外字段
deque缺陷:
不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作 为stack和queue的底层数据结构