头文件:
#include <deque>
在《C++ Prime》里面有这么一句话:除非你有很好的理由,否则应使用vector。
deque(双端队列:支持快速随机访问)内部会维护一个map(不是STL中的map容器),即一小块连续的空间,该空间中每个元素都是指针,指向另一段(较大的)区域,这个区域称为缓冲区,缓冲区用来保存deque中的数据。因此deque在随机访问和遍历数据会比vector慢。它首次插入一个元素,默认会动态分配512字节空间,当这512字节空间用完后,它会再动态分配自己另外的512字节空间,然后虚拟地连在一起。deque的这种设计使得它具有比vector复杂得多的架构、算法和迭代器设计。它的随机访问和遍历性能比vector差。
deque是一种优化了的对序列两端元素进行添加和删除操作的基本序列容器。通常由一些独立的区块组成,第一区块朝某方向扩展,最后一个区块朝另一方向扩展。它允许较为快速地随机访问但它不像vector一样把所有对象保存在一个连续的内存块,而是多个连续的内存块。并且在一个映射结构中保存对这些块以及顺序的跟踪。
参考文章:
[1] 标准模板库(deque)
[2] C++之deque
[3] 《C++ Prime》
1、deque
(1)构造函数和析构函数
(2)非变动性操作
(3)变动性操作
注意:
- 除了at()函数,其他成员函数都不会检查索引或迭代器是否有效
- 元素的插入和删除可能会导致内存重新分配。所以任何插入或删除操作都会使所有指向deque元素的pointers、reference、iterators失效。唯一例外的是在首尾插入元素之后,pointers和reference可能仍然有效。
2、deque和vector的异同
(1)deque和vector的不同之处:
- 两端都能够快速插入和删除元素。vector只能在尾端进行
- deque的元素存取和迭代器操作会稍微慢一些。因为deque的内部结构会多一个间接过程
- 迭代器是特殊的智能指针,而不是一般指针。它需要在不同的区块之间跳转
- deque可以包含更多的元素,其max_size可能更大。因为不止使用一块内存
- 不支持对容量和内存分配时机的控制
- deque的内存区块不再被使用时,会被释放。deque的内存大小是可缩减的。不过,是不是这么做以及怎么做由实作版本定义。
注意:在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointers、references、iterators失效。不过,deque的内存重分配优于vector。因为其内部结构显示不需要复制所有元素。
(2)deque和vector相似的特性:
- 在中间部分插入和删除元素相对较慢,因为所有元素都要被移动
- 迭代器属于随即存取迭代器
(3)最好采用deque的情形:
- 需要在两端插入和删除元素
- 无需引用容器内的元素
- 要求容器释放不再使用的元素。