Deque简介
² deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
² deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
² deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
² deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。
² #include <deque>
deque对象的默认构造
deque采用模板类实现,deque对象的默认构造形式:deque<T> deqT;
deque <int> deqInt; //一个存放int的deque容器。
deque <float> deq Float; //一个存放float的deque容器。
deque <string> deq String; //一个存放string的deque容器。
...
//尖括号内还可以设置指针类型或自定义类型。
deque末尾的添加移除操作
理论知识:
² deque.push_back(elem); //在容器尾部添加一个数据
² deque.push_front(elem); //在容器头部插入一个数据
² deque.pop_back(); //删除容器最后一个数据
² deque.pop_front(); //删除容器第一个数据
deque<int> deqInt;
deqInt.push_back(1);
deqInt.push_back(3);
deqInt.push_back(5);
deqInt.push_back(7);
deqInt.push_back(9);
deqInt.pop_front();
deqInt.pop_front();
deqInt.push_front(11);
deqInt.push_front(13);
deqInt.pop_back();
deqInt.pop_back();
//deqInt { 13,11,5}
deque的数据存取
理论知识:
² deque.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
² deque[idx]; //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
² deque.front(); //返回第一个数据。
² deque.back(); //返回最后一个数据
deque<int> deqInt;
deqInt.push_back(1);
deqInt.push_back(3);
deqInt.push_back(5);
deqInt.push_back(7);
deqInt.push_back(9);
int iA = deqInt.at(0); //1
int iB = deqInt[1]; //3
deqInt.at(0) = 99; //99
deqInt[1] = 88; //88
int iFront = deqInt.front(); //99
int iBack = deqInt.back(); //9
deqInt.front() = 77; //77
deqInt.back() = 66; //66
测试代码如下所示:
#include <iostream>
using namespace std;
#include "deque"
void prinV(deque<int> &v)
{
for (int i = 0; i<v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
void erroR(deque<int> &v)
{
//抛异常
try
{
for (int i = 0; i < v.size() + 3; i++)
{
cout << v.at(i) << " ";
}
}
catch (...)
{
cout << "发生异常!" << endl;
}
}
void main1()
{
deque<int> d1;
//插入数据
d1.push_back(10);
d1.push_back(9);//尾部
d1.push_front(5);
d1.push_front(6);//头部
cout << "头部元素" << d1.front() << endl;
cout << "尾部元素" << d1.back() << endl;
prinV(d1);
//删除数据
d1.pop_back();
d1.pop_front();
prinV(d1);
//用deque.at(i)抛异常
erroR(d1);
}
int main()
{
main1();
return 0;
}
运行结果如图所示: