👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨
目录
- 一、deque的介绍
- 二、deque的底层原理
- 三、 deque的缺陷
- 四、 为什么选择deque作为stack和queue的底层默认容器
一、deque的介绍
双端队列deque
:是一种可以在 头尾两端进行插入和删除的容器,并且底层是支持下标随机访问(queue
不支持随机访问)。这样看来,它似乎是vector
和list
的合体版:
-
支持随机访问:与
vector
一样,deque
支持随机访问,但是效率并不高。 -
支持快速插入和删除:与
list
一样,deque
支持在头部和尾部进行高效的插入和删除操作。这使得deque
适用于需要频繁插入和删除元素的场景。
【接口展示】
点击跳转
deque
即有vector
的优点,也有list
的优点,那么为什么还要学vector
和list
呢?
因此,我们要了解deque
的底层。
二、deque的底层原理
-
但如果深挖底层的话,
deque
并不是真正连续的空间。其底层是使用一个中控数组(指针数组)来动态开辟一个个连续的空间(数组),每个块内部是一个固定大小的数组,每个数组被称为一个缓冲区。 -
这种分段存储结构使得
deque
在需要扩容时比vector
更高效,因为只需要分配一个新的缓冲区,而不需要复制整个容器。并且若中控数组满了,扩容代价非常低,因为只需要拷贝指针。 -
当需要在
deque
的头部或尾部插入元素时,插入操作会直接在相应的头部或尾部缓冲区进行,而不需要向vector
那样进行元素的搬移。
三、 deque的缺陷
-
随机访问不够极致。因为它需要遍历搜索数据在哪个中控数组指向的数组,以及数组中的第几个元素。因此
deque
不适合遍历。 -
中间插入和删除操作相当复杂。若是直接在中间插入就要挪动当前空间的数据,牵扯其他缓冲区的重新分配和数据的移动,影响性能。
-
deque
的应用并不多,而目前能看到的一个应用就是:用其作为stack
和queue
的底层默认容器
四、 为什么选择deque作为stack和queue的底层默认容器
通过以上deque
的缺点和优点,stack
和queue
选择deque
的作为底层容器适配器就很明显了。
stack
和queue
不需要遍历(不支持随机访问[]
),只需要在固定的一端或者两端进行操作。- 在
stack
和queue
在尾插时,deque
比vector
的效率高,原因是:vector
扩容时,会找一块比原始空间更大的空间,然后再把数据拷贝到新空间;deque
扩容时不需要搬移大量数据,只需要在中控数组添加一个指针即可。 stack
和queue
不需要中间插入或者删除数据。
因此stack
和queue
选择deque
完美的避开了deque
缺陷。