一、背景介绍
所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速。而在中间插入元素则会比较费时,因为必须移动中间其他的元素。双端队列是一种随机访问的数据类型,提供了在序列两端快速插入和删除操作的功能,它可以在需要的时候改变自身大小,完成了标准的C++数据结构中队列的所有功能。它不像vector一样把所有对象保存在一个连续的内存块,而是多个连续的内存块。并且在一个映射结构中保存对这些块以及顺序的跟踪。
二、deque和vector的不同之处
vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。deque对象在队列的两端放置元素和删除元素是高效的,而向量vector只是在插入序列的末尾时操作才是高效的。
deque和vector的最大差异,
1、deque允许于常数时间内对头端进行元素的插入或移除操作
2、deque没有所谓的capacity观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。换句话说,像vector那样“因旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在deque中是不会发生的。也因此,deque没有必要提供所谓的空间预留(reserved)功能。
3、虽然deque也提供Random Access Iterator,但它的迭代器并不是普通指针,其复杂度和vector不可同日而语,这当然涉及到各个运算层面。因此,除非必要,我们应尽可能选择使用vector而非deque。对deque进行的排序操作,为了最高效率,可将deque先完整复制到一个vector身上,将vector排序后(利用STL的sort算法),再复制回deque。
三、容器的选择
1、强调快速随机访问,则vector比list好得多。
2、已知要存储元素的个数。vector好于list。
3、强调增删且不要在两端插入修改元素,则list显然要比vector好。
4、除非我们需要在容器首部插入和删除元素,deque好于vector。
四、实例
deque<string> dec;
dec.push_back("hello"); //尾部插入
dec.push_front("world"); //头部插入
//insert操作
//iterator insert (iterator position, const value_type& val);
dec.insert(dec.end(), "aaaaaa");
//void insert (iterator position, size_type n, const value_type& val);
dec.insert(dec.end(), 5, "bbb");
//void insert (iterator position, InputIterator first, InputIterator last);
deque<string> t_dec(2,"ccc");
dec.insert(dec.end(), t_dec.begin(), t_dec.end());
deque<string>::iterator iter;
for (iter = dec.begin(); iter != dec.end(); iter++)
{
cout << *iter << endl;
}
参考:
https://blog.csdn.net/xiadeliang1111/article/details/83756680
https://blog.csdn.net/xiajun07061225/article/details/7442816