双端队列(deque)
Deque简介
- deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
- deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
- deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
- deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。
- 头文件#include
deque对象的默认构造
deque采用模版类实现,默认构造形式:deque<T> deqT
deque<int> deqInt; //一个存放int的deque容器
deque<double> deqDouble; //一个存放double的容器
deque<string> deqString; //一个存放string的容器
//尖括号内还可以存放设置指针类型或其他自定义类型
deque末尾的添加或移除操作
push_back(elem); //在容器尾部加入一个元素
push_front(elem); //在容器头部加入一个元素
pop_back(); //删除尾部元素
pop_front(); //删除头部元素
deque数据的存取
deque.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
deque[idx]; //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
deque.front(); //返回第一个元素
deque.back(); //返回最后一个元素
deque与迭代器
deque.begin(); //返回第一个元素的迭代器
deque.end(); //返回最后一个元素之后的迭代器
deque.rbegin(); //返回指向尾部的逆向迭代器
deque.rend(); //返回指向头部的逆向迭代器
deque的大小
deque.size(); //返回容器中元素的个数
deque.empty(); //判断容器是否为空
deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num,elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque的插入
deque.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
deque.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
deque.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
deque的删除
deque.clear(); //移除容器的所有内容
deque.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
deque.erase(pos); //删除pos位置的数据,返回下一个数据的位置。
代码演示
删除容器中重复的元素
#include<iostream>
#include<deque>
#include<iterator>
using namespace std;
int main()
{
int a[10]={1,3,2,3,3,3,4,3,5,3};
deque<int> deInt(a,a+10);
cout<<deInt.size()<<endl; //10
for(deque<int>::iterator it=deInt.begin();it!=deInt.end();)
{
if(*it==3)
it=deInt.erase(it); //删除迭代器所指元素,并返回下一个元素的迭代器
else
it++;
}
for(deque<int>::iterator it=deInt.begin();it!=deInt.end();it++)
{
cout<<*it<<" "; //1 2 4 5
}
cout<<endl;
deInt.erase(deInt.begin(),deInt.end());
cout<<deInt.size()<<endl; //0
return 0;
}