deque双端队列容器
deque双端队列容器和vector一样,采用线性表顺序存储结构。但与vector不同的是,deque采用分块的线性存储结构来存储数据,每块的大小一般为512字节,称一个deque块,所有的deque块使用一个Map块进行管理,每个Map数据项记录各个deque块的首地址,这样,deque快在头部和尾部都可以插入和删除元素,而不需要移动其他元素。一般来所,当考虑到容器元素的内存分配策略和操作的性能时,deque相对于vector更有优势。
使用deque需要声明头文件“#include <deque>"
1. 创建deque对象
创建deque对象方法通常有三种:
(1) 创建没有任何元素的deque对象,如:
deque<int> d;
deque<float> dd;
(2) 创建具有n个元素的deque对象,如:
deque<int>d(10);//创建具有10个整型元素的deque对象d
(3) 创建具有n个元素的deque对象,并赋初值,如:
deque<int> d(10,8.5);//创建具有10个整型元素的deque对象d,每个元素值为8.5
2. 插入元素
a) 使用push_back()方法从尾部插入元素,会不断扩张队列
#include <deque>
#include <iostream>
using namespace std;
int main(int argc,char * argv[])
{
//定义deque对象,元素类型为整型
deque<int> d;
//从尾部连续插入三个元素
d.push_back(1);
d.push_back(2);
d.push_back(3);
//以数组方式输出元素
cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl;
return 0;
}
/*
运行结果:
1 2 3
*/
b) 从头部插入元素,不会增加新元素,只将原有的元素覆盖
#include <deque>
#include <iostream>
using namespace std;
int main(int argc,char * argv[])
{
//定义deque对象,元素类型为整型
deque<int> d;
//从尾部连续插入三个元素
d.push_back(1);
d.push_back(2);
d.push_back(3);
//从头部插入元素,不会增加新元素,只将原来的元素覆盖
d.push_front(10);
d.push_front(20);
//以数组方式输出元素
cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl;
return 0;
}
/*
运行结果:
20 10 1
*/
c) 从中间插入元素,不会增加新元素,只将原有的元素覆盖
#include <deque>
#include <iostream>
using namespace std;
int main(int argc,char * argv[])
{
//定义deque对象,元素类型为整型
deque<int> d;
//从尾部连续插入三个元素
d.push_back(1);
d.push_back(2);
d.push_back(3);
//中间插入元素,不会增加新元素,只将原有的元素覆盖
d.insert(d.begin()+1,88)
//以数组方式输出元素
cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl;
return 0;
}
/*
运行结果:
1 88 2
*/
3. 遍历
1) 以数组方式遍历
2) 以前向迭代器的方式遍历
3) 反向遍历
#include <deque>
#include <iostream>
using namespace std;
int main(int argc,char * argv[])
{
//定义deque对象,元素类型为整型
deque<int> d;
//从尾部连续插入三个元素
d.push_back(1);
d.push_back(2);
d.push_back(3);
//以数组方式输出元素
int i;
for(i=0;i<d.size();i++)
cout<<d[i]<<" ";
cout<<endl;
//以前向迭代器的方式遍历
deque<int>::iterator it;
for(it=d.begin();it!=d.end();it++)
cout<<*it<<" ";
cout<<endl;
//以反向迭代器的方式遍历
deque<int>::reverse_iterator rit;
for(rit=d.rbegin();rit!=d.rend();rit++)
cout<<*rit<<" ";
cout<<endl;
return 0;
}
/*
运行结果:
1 2 3
1 2 3
3 2 1
*/
4. 删除元素
1) 采用pop_front()方法从头部删除元素。
#include <deque>
#include <iostream>
using namespace std;
int main(int argc,char * argv[])
{
//定义deque对象,元素类型为整型
deque<int> d;
//从尾部连续插入三个元素
d.push_back(1);
d.push_back(2);
d.push_back(3);
d.push_back(4);
d.push_back(5);
//从头部删除元素
d.pop_front();
d.pop_front();
//以前向迭代器的方式遍历
deque<int>::iterator it;
for(it=d.begin();it!=d.end();it++)
cout<<*it<<" ";
cout<<endl;
return 0;
}
/*
运行结果:
3 4 5
*/
2) 采用pop_back()方法从尾部删除元素。
#include <deque>
#include <iostream>
using namespace std;
int main(int argc,char * argv[])
{
//定义deque对象,元素类型为整型
deque<int> d;
//从尾部连续插入三个元素
d.push_back(1);
d.push_back(2);
d.push_back(3);
d.push_back(4);
d.push_back(5);
//从头部删除元素
d.pop_back();
//以前向迭代器的方式遍历
deque<int>::iterator it;
for(it=d.begin();it!=d.end();it++)
cout<<*it<<" ";
cout<<endl;
return 0;
}
/*
运行结果:
1 2 3 4
*/
3) 使用erase()方法从中间删除元素,位置为参数迭代器位置
#include <deque>
#include <iostream>
using namespace std;
int main(int argc,char * argv[])
{
//定义deque对象,元素类型为整型
deque<int> d;
//从尾部连续插入三个元素
d.push_back(1);
d.push_back(2);
d.push_back(3);
d.push_back(4);
d.push_back(5);
//从中间删除元素,参数为迭代器位置
d.erase(d.begin()+1);
//以前向迭代器的方式遍历
deque<int>::iterator it;
for(it=d.begin();it!=d.end();it++)
cout<<*it<<" ";
cout<<endl;
return 0;
}
/*
运行结果:
1 3 4 5
*/
4) 使用clear()方法清空deque对象。
#include <deque>
#include <iostream>
using namespace std;
int main(int argc,char * argv[])
{
//定义deque对象,元素类型为整型
deque<int> d;
//从尾部连续插入三个元素
d.push_back(1);
d.push_back(2);
d.push_back(3);
d.push_back(4);
d.push_back(5);
//清空
d.clear();
cout<<d.size()<<endl;
return 0;
}
/*
运行结果:
0
*/