输出受限的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列)和输入受限的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了。
双端队列是除向量vector外唯一一个支持随机存取迭代器的容器。但它在一个方面比vector做的好,可以在被控序列的开始处以常数时间插入或删除元素,当然,它也支持在序列的末端以常数时间做插入和删除,但在尾端的操作和vector没有什么区别。
为了能够在两端都可以高效的插入删除元素,双端队列在某个偏移量off处开始其有效内容,它把序列的长度存在另一个整数size中。假如我们没有在被控序列的中间插入或删除元素,那么即使对它的任意一端进行了插入或删除元素,原有的迭代器还是能够继续的指向它原来所指向的元素。
双端队列可以像列表一样很好的实现先进先出(FIFO)队列或后进先出(LIFO)队列(即栈)。与列表list进行比较,如果我们需要对被控序列的元素进行随机存取,那么deque是远胜于list的;如果我们希望频繁的在任意位置插入新元素,双端队列需要的时间是线性的,而list需要的时间仅为常数。
双端队列与vector比较,虽然在所有的操作中,双端队列的效率比vector非平即胜,但是双端队列比向量vector需要更多的存储空间的开销,并且在双端队列中任意存取一个元素所需的时间还是比vector多很多。
因此,可以把双端队列deque看做是向量vector和列表list的一个折中。如果对于给定应用程序中的大部分操作,其时间复杂度在能够接受的范围内,那么最好选用vector或list中的一个;如果需要在效率和效率引入的复杂度之间维持平衡,那么推荐选择双端队列deque。
包含头文件 #include <deque> 声明命名空间 using namespace std;
1)构造函数
deque(); //创建一个空的deque 如:deque<int> a;
deque(int nSize); //创建一个空的deque,元素个数为nSize 如:deque<int> a(10);
deque(int nSize,const T& val); //创建一个deque,元素个数为nSize,且值都为val 如:deque<string> a(5,"have fun");
deque(const deque&); //拷贝(复制)构造函数
如:deque<string> a(5,"have fun");
deque<string> b(a);
deque(begin,end); //复制另一个数组[begin,end)区间内的元素到deque中
如:int ia[6] = { -2, -1, 0, 1, 2, 1024 };
deque<int> a(ia,ia+6);
2)插值取值函数
void push_front(const T& val); //双端队列头部增加一个元素val
void push_back(const T& val); //双端队列尾部增加一个元素val
void pop_front(); //删除双端队列的第一个元素,双端队列不能为空
void pop_back(); //删除双端队列的最后一个元素,双端队列不能为空
void assign(size_type n,const T& x); //重置双端队列,把双端队列设置为由n个元素组成的值为x的新双端队列
void assign(const_iterator first,const_iterator last); //重置双端队列,把双端队列中[first,last)的元素设置成当前元素
iterator insert(iterator it,const T& x); //双端队列中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x); //双端队列中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last); //双端队列中迭代器指向元素前插入另一个相同类型双端队列的[first,last)间的数据
3)删除元素
iterator erase(iterator it); //删除双端队列中迭代器指向元素;
iterator erase(iterator first,iterator last); //删除双端队列中[first,last)中元素,注意last是指向要删除的最后一个元素的下一个元素;
void clear(); //清空双端队列中所有元素,功能等同于erase(deque.begin(),deque.end());
4)遍历函数
reference front(); //返回首元素的引用
reference back(); //返回尾元素的引用
iterator begin(); //返回双端队列头指针,指向第一个元素
iterator end(); //返回双端队列尾指针,指向双端队列最后一个元素的下一个位置
reverse_iterator rbegin(); //反向迭代器,指向最后一个元素
reverse_iterator rend(); //反向迭代器,指向第一个元素之前的位置
reference at(size_type pos); //随机存取pos位置的元素
reference operator[](size_type pos); //随机存取pos位置的元素
5)判断函数
bool empty() const:判断双端队列是否为空,若为空,则返回true
6)大小函数
void resize(size_type n); //将双端队列的元素调整到n个,多删少补,值随机
void resize(size_type n,T& x); //将双端队列的元素调整到n个,多删少补,值为x
int size() const; //返回当前双端队列中元素的个数
int max_size() const; //返回最大可允许的deque元素数量值
7)其他函数
void swap(deque& x); //交换两个deque中的元素