17 deque

容器适配器

适配器

适配器是一种射击模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另一个接口
在这里插入图片描述

STL库中的stack和queue的结构

虽然stack和queue也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器射配齐,因为stack和队列都是堆其他容器的接口进行了包装,STL中stack和queue默认使用deque,比如:

在这里插入图片描述
在这里插入图片描述

deque的介绍

deuqe双端队列:是一种双开口的连续空间的数据结构,可以在头尾两端进行插入和删除,时间复杂度为O(1),不需要移动元素,和list比较,空间利用率比较高

在这里插入图片描述

deque并不是真正连续的空间,而是由一段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:

结构

在这里插入图片描述

有一个中控数组,记录了每一个数组的指针,从中间往两边存。指向的数组内根据顺序从第一个数组往后排列。头插从第一个数组最后一个位置往前插入。如果数组满了,就在中控新建一个指针,指向新创的数组

在这里插入图片描述

具体结构,每一个节点由四个指针,分别指向数组的当前位置,起始位置和结束位置,根据结束位置判断是否遍历当前数组结束。如果完了,node指向的中控数组找到下一个数组的node节点

优点和缺陷

与vector相比,头部插入和删除不需要移动元素,效率高。扩容也不需要挪动大量元素
与list相比,连续空间,利用高、
但是,不适合遍历,编历时,迭代器要频繁检测是否到了小段空间的边界。序列式场景,可能需要经常遍历,vector和list用的多

1.相比vector,头插头删,扩容代价低
2.支持随机访问

1.中间插入删除很难搞
2.没有vector和list的优点极致

每个buff数组不一样大,中间插入的效率变高随机访问效率就变低
每个buff固定大小,牺牲中间插入的效率,随机访问效率变高

考虑到deque的特点,更适合作为stack和queue的底层数据结构

为什么选择deque

stack是一种后进先出的特殊结构,只有尾插和尾删的惭怍,queue是先进先出的结构,尾插和头删,都可以用deque作为容器

1.stack和queue不需要遍历,只需要在固定的端进行操作
2.stack中元素增长时,deque比vector的扩容效率高,queue元素增长时,deque不仅效率高,而且内存使用率高

运用了deque的优点,避开了它的缺陷

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值