一、deque 双端队列容器
#include <deque>
是下标顺序容器,它允许在首尾两端快速地插入、删除数据
deque的元素不是全部相邻存储的:采用单独分配的固定大小数组的序列存储数据,以及额外的登记表(中控数组),该表中记录了所有序列的地址,这表示通过下标访问元素时必须经过两次指针解引用,vector只需要一次
deque支持随机访问,效率依然是O(1)
deque的内存也可以按需要自动扩展、收缩,并且deque的扩展比vector更优。因为不涉及到复制、销毁环节
1、vector与deque扩容区别
①vector扩容,先申请一块更大的新内存,把原内存数据拷贝,释放原内存
②deque扩容,只需要申请一块新的固定大小的序列,记录到中控数组即可
deque比vector多push_front\pop_front操作,并且效率也能O(1)
vector比deque多个reserve预分配内存,因为deque不需要预分配内存来节约时间
2、deque的优点
①与vector相比,头部插入、删除时,不需要搬运后序元素,效率特别高(O(1));在扩容时,也不需要移动、释放原内存,只需操作中控数组即可
②与list相比,底层依然是连续空间,空间利用率更高,支持随机访问O(1)
3、deque缺点
①没有vector和list那么极致,随机访问的速度比vector慢(vector是真正的连续空间);中间位置的插入、删除没有list快,list根本不需要扩容
②不适合遍历,因为在遍历时deque的迭代器需要频繁地检查是否移动到了某个序列的末尾,并且需要解两次引用,效率低
③因此当需要线性容器时,大多数情况下优先考虑vector、list,deque的应用不多(stack/queue)
二、stack 栈容器(适配器)
#include <stack>
底层由deque实现的
不支持运算符,没有迭代器,只有无参构造、拷贝构造
empty、push、pop、top、size
三、queue 队列容器(适配器)
#include <queue>
底层由deque实现的
不支持运算符,没有迭代器,只有无参构造、拷贝构造
empty、push、pop、front、back、size
四、priority_queue 优先队列容器(适配器)
#include <queue>
1、底层实现
底层采用vector实现,当数据入队时,会对数据调整成堆结构,默认是大顶堆,元素越大,优先级越高,优先出队
注意:存储的元素必须支持 < 运算符,如果是类类型数据必须重载 < 运算符
注意 :只能查看top
2、如何调整优先队列的优先级(小顶堆)
①元素取反存入、取出取反
②类类型数据重载 < 运算符,调整 < 运算符的比较过程
③固定语法
priority_queue<类型, vector<类型>, greater<类型> > 队列名;
// 升序
priority_queue<类型, vector<类型>, less<类型> > 队列名;
// 降序