deque:双端队列
目录
deque:双端队列
1、 基本介绍
2、使用方法
2.1、 头文件
2.2、 定义
2.3、 方法函数
3、排序
1、 基本介绍
首尾都可插入和删除的队列为双端队列。
deque容器是连续的空间,其他连续的行空间还有 array 和 vector,array无法动态变化,vector只能在尾端动态增加,其增加也更像是一个假象,实际的操作为:
- 申请一个更大的空间
- 将原数据复制到新空间
- 释放原空间
如果不是每次vector配置的新空间都留有富裕,其动态变化带来的代价将非常巨大。
deque是由一段一段定量的连续空间构成的。一旦需要在deque头部或者尾部增加新的空间时,便配置一段连续定量的空间,串接在deque的头部或者尾部。deque最大的工作就是维护这些分段连续的空间的整体性的假象,并为其提供随机存取的接口,避开了重新配置空间、复制和释放的循环,而代价是复杂的迭代器架构。
因为deque是分段连续的内存空间,必须有中央控制,从而维持整体连续的现象,导致了其数据结构的设计及迭代器的前进和后退操作较为频繁,所以deque的代码实现比vector和list都多得多。
deque采取一块所谓的map(不是STL的map容器)作为主控,所谓的map是一小块连续的内存空间,其中每一个元素(此处成为一个结点)都是一个指针,指向另一段连续性内存空间,称作缓冲区。缓冲区才是deque的存储空间的主体。
2、使用方法
2.1、 头文件
#include<deque>
2.2、 定义
deque<int>dq;
2.3、 方法函数
deque<int> dq;
int x = 12;
dq.push_back(x); //把x压入后端
dq.push_front(x); //把x压入前端
dq.back(); //访问(不删除)最后端元素
dq.front(); //访问(不删除)最前端元素
dq.pop_back(); //删除最后端元素
dq.pop_front(); //删除最前端元素
dq.erase(iterator it); //删除it处的元素
dq.erase(iterator begin,iterator end); //删除[begin,end)处的元素
dq.empty(); //判断deque是否空
dq.size(); //返回deque的元素数量
dq.clear(); //清空deque
3、排序
deque<int> dq;
//从小到大
sort(dq.begin(),dq.end())
//从大到小排序
sort(dq.begin(), dq.end(), greater<int>()); //deque里面的类型需要是int型
sort(dq.begin(), dq.end(), greater()); //高版本C++才可以用