deque(简单介绍一下)

deque的基本情况:

简单的来说deque是一个双头队列。且两边的尺寸可以动态收缩或者扩张。

其底层实现相当复杂,而且效率并不高。大多数时候都不会使用。

deque诞生的原因是vector和list的优缺点不可分割。

正好复习一下vector和list的优缺点。

vector的优点:支持随机访问;尾插,尾删很方便;高速缓存命中率高。

vector的缺点:不支持头插或者中间插入;扩容具备一定的性能消耗,以及空间浪费。

list的优点:任意位置插入删除数据只需要O(1)复杂度;按需申请释放空间,没有损耗。

list的缺点:不支持随机访问,高速缓存命中率低。

对比两者的优缺点,发现他们的缺点正是为了他们的优点诞生的,两者不可分割。deque就是针对两者的缺点设计出来的,所以性能被牺牲了。

deque的底层大概是这样的结构:

如何满足随机访问?

要访问的下标,减去第一个数组具有的元素个数,然后/10,就能知道在第几个空间了。%10就能知道在第几个位置。

deque的优点:

1.头插和尾插效率不错

2.支持随机访问

3.高速缓存命中率高

4.扩容代价小

deque的缺点

1.中部插入删除效率不行,(要么需要挪动数据,要么支持每个开辟的空间大小不一定相同,这样的话,中控数组还要记录每个空间有多少个元素,因为要支持随机访问)

2.虽然支持随机访问,但效率相对于vector而言还有差距。频繁随机访问时要小心。

以排序为例(测试在release下):

用deque存数据,进行排序,和vector存数据(和deque中的内容一样),进行排序。10000以内没什么区别,之后的每个数量级,deque花费的时间都是vector的2倍左右。

如果将deque的数据拷贝进vector,进行排序,排序完再将数据拷贝给deque(用assign拷贝回deque),和直接对vector中的数据排序所花费的时间,进行比较,deque花费的时间大概是vector的1.4倍左右。

所以deque适合在大量头尾存储删除数据的时候使用,比如stack和queue,栈和队列使用deque比使用vector/list更合适。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值