stack 和 queue是C++的STL库中的容器适配器,本文对容器适配器进行讲解。
下面进入主题。
一. 容器适配器
1.1 概念:
1.2 STL标准库中stack和queue的底层结构
虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配 器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque,比如:
1.3 deque的原理介绍
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。
deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:
双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示:
那deque是如何借助其迭代器维护其假想连续的结构呢?
1.4 deque的缺陷
与
vector
比较
,
deque
的优势是:头部插入和删除时,
不需要搬移元素,效率特别高
,而且在
扩容时,也不
需要搬移大量的元素
,因此其效率是必
vector
高的。
与
list
比较
,其底层是连续空间,
空间利用率比较高
,不需要存储额外字段。
但是,
deque
有一个致命缺陷:不适合遍历,因为在遍历时,
deque
的迭代器要频繁的去检测其是否移动到
某段小空间的边界,导致效率低下
,而序列式场景中,可能需要经常遍历,因此
在实际中,需要线性结构
时,大多数情况下优先考虑
vector
和