deque双端队列容器

deque采用分块的星星存储结构来存储数据,每块的大小一般为512个字节,称为一个deque块,所有的deque块使用一个map块进行管理,每个map数据项纪录各块的首地址。

deque块在头部和尾部都可以插入和删除元素,而不需要移动其他元素(使用push_back()方法在尾部插入元素,会扩张队列;而使用push_back()方法在手部插入元素和使用insert()方法在中间插入元素)。

一般来说,当考虑到容器元素的内存分配策略和操作的性能时,deque相对于vector更具有优势。

使用deuqe需要声明头文件包含“#include<deque>”。


创建deque对象


创建deque对象的方法通常有三种,建立对象的时候可以选择不带参数,带一个参数,两个参数。

(1)创建没有任何元素的deque对象

deque<int> d;
deque<float> dd;


(2)创建具有n个元素的deque对象

deque<int> d(10);   //创建具有10个整形元素的deque对象d


(3)创建具有n个元素的deque对象,并赋初值

deque<float> d(10,2.5);   //创建1具有10个初值为2.5的float型的deque对象d


插入元素


(1)使用push_back()方法从尾部插入元素,会不断扩张队列。

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	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 

(2)使用push_front()方法从头部插入元素,其他元素向后移动

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_front(3);
	cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl;
	return 0;
} 
程序输出 3 1 2

(3)使用insert()方法从中间插入元素,其参数有两个,第一个是迭代器参数,第二个是插入元素的值

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	d.insert(d.begin()+1,10);
	cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<" "<<d[3]<<endl;
	return 0;
} 
程序输出 1 10 2 3


前向遍历


(1)以数组方式遍历

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	for(int i=0;i<3;i++)cout<<d[i]<<" ";
	return 0;
} 

(2)以前向迭代器的方式遍历

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	
	deque<int>::iterator it;
	for(it=d.begin();it<d.end();it++)cout<<*it<<" ";
	return 0;
} 


反向遍历


采用反向迭代器对双端队列容器进行反向遍历

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	
	deque<int>::reverse_iterator rit;
	for(rit=d.rbegin();rit<d.rend();rit++)cout<<*rit<<" ";
	return 0;
} 
输出 3 2 1


删除元素


可以从deque中的首部、尾部、中部删除元素,并可以清空双端队列容器。

(1)采用pop_front()方法从头部删除元素

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	for(int i=1;i<10;i++)
	 d.push_back(i);
	
	d.pop_front();
	d.pop_front();
	 
	deque<int>::iterator it;
	for(it=d.begin();it<d.end();it++)cout<<*it<<" ";
	return 0;
} 

输出 3 4 5 6 7 8 9

(2)采用pop_back()方法从尾部删除元素

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	for(int i=1;i<10;i++)
	 d.push_back(i);
	
	d.pop_back();
	d.pop_back();
	 
	deque<int>::iterator it;
	for(it=d.begin();it<d.end();it++)cout<<*it<<" ";
	return 0;
} 

输出:1 2 3 4 5 6 7    

(3)使用erase()方法从中间删除元素,其参数是迭代器位置。

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	for(int i=1;i<10;i++)
	 d.push_back(i);
	
	d.erase(d.begin()+2);
	d.erase(d.begin()+5);
	 
	deque<int>::iterator it;
	for(it=d.begin();it<d.end();it++)cout<<*it<<" ";
	return 0;
} 

输出:1 2 4 5 6 8 9

(4)使用clear()方法清空deque对象

#include<deque>
#include<iostream>
using namespace std;
int main()
{
	deque<int> d;
	for(int i=1;i<10;i++)
	 d.push_back(i);
	d.clear();
	cout<<d.size()<<endl;
	return 0;
} 


posted @ 2014-04-13 00:28  千手宇智波  阅读(297)  评论(0编辑  收藏  举报