【C++初阶】deque容器的介绍以及为什么stack和queue选择deque的作为底层容器适配器

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


一、deque的介绍

在这里插入图片描述

双端队列deque:是一种可以在 头尾两端进行插入和删除的容器,并且底层是支持下标随机访问(queue不支持随机访问)。这样看来,它似乎是vectorlist的合体版:

  1. 支持随机访问:与vector一样,deque支持随机访问,但是效率并不高。

  2. 支持快速插入和删除:与list一样,deque支持在头部和尾部进行高效的插入和删除操作。这使得deque适用于需要频繁插入和删除元素的场景。

【接口展示】

点击跳转

在这里插入图片描述

deque即有vector的优点,也有list的优点,那么为什么还要学vectorlist呢?

因此,我们要了解deque的底层。

二、deque的底层原理

在这里插入图片描述

  • 但如果深挖底层的话,deque并不是真正连续的空间。其底层是使用一个中控数组(指针数组)来动态开辟一个个连续的空间(数组),每个块内部是一个固定大小的数组,每个数组被称为一个缓冲区。

  • 这种分段存储结构使得deque在需要扩容时比vector更高效,因为只需要分配一个新的缓冲区,而不需要复制整个容器。并且若中控数组满了,扩容代价非常低,因为只需要拷贝指针。

  • 当需要在deque的头部或尾部插入元素时,插入操作会直接在相应的头部或尾部缓冲区进行,而不需要向vector那样进行元素的搬移。

三、 deque的缺陷

  • 随机访问不够极致。因为它需要遍历搜索数据在哪个中控数组指向的数组,以及数组中的第几个元素。因此deque不适合遍历

  • 中间插入和删除操作相当复杂。若是直接在中间插入就要挪动当前空间的数据,牵扯其他缓冲区的重新分配和数据的移动,影响性能。

  • deque的应用并不多,而目前能看到的一个应用就是:用其作为stackqueue的底层默认容器

四、 为什么选择deque作为stack和queue的底层默认容器

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

通过以上deque的缺点和优点,stackqueue选择deque的作为底层容器适配器就很明显了。

  1. stackqueue不需要遍历(不支持随机访问[]),只需要在固定的一端或者两端进行操作。
  2. stackqueue在尾插时,dequevector的效率高,原因是:vector扩容时,会找一块比原始空间更大的空间,然后再把数据拷贝到新空间;deque扩容时不需要搬移大量数据,只需要在中控数组添加一个指针即可。
  3. stackqueue不需要中间插入或者删除数据。

因此stackqueue选择deque完美的避开了deque缺陷。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值