双端队列是STL中queue的“高级版”,一般队列只支持从一个方向“先进后出”,而双端队列deque支持从两个方向插入和弹出元素
定义:
#include <queue>
using namespace std;
int main()
{
deque<int> a;
return 0;
}
当然这里的int可以换成其他类型,double、long、char、string、甚至是自定义类型。
操作:
(由于时间有限,只写出与竞赛有关的操作)
#include <queue>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
deque<int> dq; //定义队列
dq.clear(); //清空队列
dq.push_back(1); //从尾部插入元素“1”
dq.push_front(4); //从头部插入元素“4”
printf("%d\n",dq.size()); //返回队列元素个数
printf("%d\n",dq.front()); //返回队列首部元素
printf("%d\n",dq.back()); //返回队列尾部元素
deque<int>::iterator it=dq.begin(); //定义迭代器
for (it=dq.begin();it!=dq.end();it++) //依次遍历输出
printf("%d\n",*it);
dq.pop_back(); //弹出队尾元素
printf("%d\n",dq.back());
dq.pop_front(); //弹出队首元素
if (dq.empty()) printf("The queue is empty! %d \n",dq.size()); //检查队列是否为空
system("pause");
return 0;
}
输出结果:
值得一提的是,deque也可以像数组一样,通过dq[i]这种形式,访问元素。
效率:
deque在首尾插入等操作方面是几乎不耗时的,但初始化就不一定了:据说有人测过n=10^6时要0.3秒? 还有没介绍的中间插入和删除,如果你用了,那么卡个评测机几分钟应该是没问题的……(原理就像vector,中间插入需要移动大量元素)
所以,还是那句话:能不用STL尽量别用,还是老老实实开数组或者用vector吧……