一、deque介绍
deque 是 double-ended queue 的缩写,又称双端队列
使用deque要包括头文件:
#include <deque>
一些创建、插入、删除的基本操作代码
#include <iostream>
#include <deque>
#include<algorithm>
using namespace std;
int main(){
//deque的创建操作和vector别无二致
//创建空的deque
deque<int> d;
deque<int>::iterator i;
//插入元素
for(int j=0;j<10;j++){
d.push_back(j);
}
//deque是双端队列,因此可以在头部插入元素
d.push_front(66);
// deque是双端队列,同理,可以在头部弹出元素
d.pop_front();
//弹出尾部元素
d.pop_back();
//迭代器输出deque元素
for(i=d.begin();i<d.end();i++){
cout<<*i<<" ";
}
return 0;
}
二、deque的迭代器操作
正向遍历
for(auto i=d.begin();i<d.end();i++){
cout<<*i<<" ";
}
//运行结果:0 1 2 3 4 5 6 7 8 9
反向遍历
使用rbegin()和rend()两个函数,分别指向最后一个元素和第一个元素的前一个元素,其中++操作是往左移,–操作是往右移动
for(auto i=d.rbegin();i<d.rend();i++){
cout<<*i<<" ";
}
//运行结果:9 8 7 6 5 4 3 2 1 0
三、deque访问元素和insert()操作
#include <iostream>
#include <deque>
#include<algorithm>
using namespace std;
int main(){
deque<int> d;
auto i=d.rbegin();
for(int j=0;j<10;j++){
d.push_back(j);
}
//1、使用迭代器访问deque
for(auto i=d.begin();i<d.end();i++){
cout<<*i<<" ";
}
//2、使用下标随机访问
cout<<"使用下标随机访问:"<<d[2]<<endl;
//3、使用at()检查越界访问,越界,报错
cout<<"使用at()检查越界访问"<<d.at(4)<<endl;
//4、使用front()、end()访问元素
cout<<"使用front()"<<d.front()<<endl;
cout<<"使用back()、"<<d.back()<<endl;
//插入元素操作insert()
//1、指定位置插入指定元素
d.insert(d.begin()+1,44);
//2、指定位置插入n个指定值
d.insert(d.begin()+1,2,88);
//3、插入另一迭代器一定范围内的值
vector<int> num;
for(int i=0;i<5;i++){
num.push_back(i);
}
d.insert(d.begin()+3,num.begin(),num.end());
for(auto i=d.begin();i<d.end();i++){
cout<<*i<<" ";
}
return 0;
}
五、注意事项
deque被创建之后,已添加元素并创建了迭代器auto i = deque.begin()
之后,若继续添加元素,也许会产生原来的deque位置内存不足,因此需要将原deque移动或复制到新的地址空间(原来的地址空间会被释放),所以此时原i迭代器将失效(deque首地址变了),因此每一次为deque添加新元素之后,都应该重新获取其迭代器,否则将导致程序崩溃。
四、遇到的问题
在使用auto声明变量类型的时候出现以下错误:
后来搜了一下问题原因,auto声明是在c++11的标准中添加的,所以要修改IDE的编译器选项,DEV c++的解决办法如下:
参考学习链接:http://c.biancheng.net/view/6866.html