[C++]-deque 双端队列
什么是双端队列
双端队列(Double Ended Queue)是一种支持首尾端高效地插入数据、支持随机访问的容器。它可以在需要的时候改变自身大小,完成了标准的C++数据结构中队列的所有功能。
内部实现
双端队列内部实现不如vector
直观。双端队列中的数据被表示为一个分段的数组,容器中的元素分段保存在一个个大小固定的数组中。此外,容器还需要维护一个用来存放这些数组首地址的索引数组。也正是因为数据存放不连续,导致deque
的随机访问没有vector
快。
双端队列的定义和初始化
#include<deque> // 头文件
deque<type> deq; // 声明一个元素类型为type的双端队列que
deque<type> deq(size); // 声明一个类型为type、含有size个默认值初始化元素的的双端队列que
deque<type> deq(size, value); // 声明一个元素类型为type、含有size个value元素的双端队列que
deque<type> deq(mydeque); // deq是mydeque的一个副本
deque<type> deq(first, last); // 使用迭代器first、last范围内的元素初始化deq
双端队列的常用方法
deq.push_back() //在队尾插入元素
deq.push_front() //在队首插入元素
deq.insert(deq.begin()+1,9); //第一个元素之后插入9,后面元素后移
deq.size() //双端队列的大小
deq.empty() //判断是否为空
deq.begin() //队首的指针,指向队首元素
deq.end() //队尾元素的下一位作为指针
deq.rbegin() //指向最后一个元素的指针
deq.rend() //指向第一个元素的前一个位置的指针
deq.erase(point) //删除指针piont所指的元素
deq.clear() //删除所有元素
deq.pop_front() //弹出队首元素
deq.pop_back() //弹出队尾元素
#include<iostream>
#include<deque>
using namespace std;
void Print(deque<int>deq) // 打印
{
for(deque<int>::iterator iter=deq.begin(); iter<deq.end(); iter++)
cout<<*iter<<"\t"; cout<<endl;
}
int main()
{
deque<int>deq(6,2);
for(int i=0; i<deq.size(); i++)
cout<<deq[i]<<"\t"; cout<<endl; // 下标随机访问
deq.push_front(1); // 队首插入
deq.push_back(3); // 队尾插入
Print(deq);
deq.insert(deq.begin()+2,22); // 指定位置插入数据,后面数据依次后移
Print(deq);
deq.erase(deq.begin()+2); // 删除指定的元素
Print(deq);
deq.pop_back(); deq.pop_front(); // 弹出队尾队首元素,没有返回值
Print(deq);
deq.clear(); // 清楚整个队列
cout<<deq.empty();
}
/*
运行结果:
2 2 2 2 2 2
1 2 2 2 2 2 2 3
1 2 22 2 2 2 2 2 3
1 2 2 2 2 2 2 3
2 2 2 2 2 2
1
*/