C++deque的使用

本文深入解析双端队列deque的特点与应用,对比vector,介绍deque在头部和尾部高效插入与删除的优势,以及其动态空间管理和迭代器特性。通过实例演示deque的基本操作。

一、背景介绍

所谓的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

https://blog.csdn.net/hero_myself/article/details/52312644?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值