STL容器与算法 (六)C++ Deque双端队列知识点

C++ deque双端队列

deque,全名double-ended queue是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

deque与vector、list

1.内存比较
vector:连续空间
list :不连续空间
duque : 段连续空间
在这里插入图片描述
2.功能比较
vector:

  • 随机位置的插入和删除效率比较低
  • 随即访问的效率高(下标运算)
  • 不支持头添加,支持尾添加

list:

  • 随机位置的插入和删除效率高
  • 不支持随机访问
  • 支持头添加,支持尾添加

deque:

  • 随机位置的插入和删除效率不高(以512个字节为一个单位量)
  • 支持随机访问【比vector慢,因为要做堆跳转】,迭代器的结构较为复杂,会降低访问效率
  • 支持头添加,支持尾添加

3.使用选择

  • 随机访问操作频率高,就选用vector
  • 插入删除频率高,头尾添加,就选用list
  • 随机访问+头添加,就选deque

4.与vector函数对比
没有了capacity和reserve,其他均一样。


在这里插入图片描述


头文件

#include<iostream>
#include<deque>
using namespace std; 

定义

void DequeDefine()
{
	
	deque<int> dq;  //定义int型双端队列 
	deque<string> dq1;//定义string型队列 
	deque<char> dq2;// 定义char型队列 
//	struct STU{
//		int age;
//		int y;
//	};
//	deque<struct STU> dq3;   //定义结构型队列
	
}

构造函数

语法: deque();

deque( size_type size );
deque( size_type num, const TYPE &val );
deque( const deque &from );
deque( input_iterator start, input_iterator end );

C++ Deques能用以下方式创建:

  • 无参,创建一个空双向队列
  • size - 创建一个大小为size的双向队列
  • num and val - 放置num个val的拷贝到队列中,
  • from - 从from创建一个内容一样的双向队列
  • start 和 end - 创建一个队列,保存从start到end的元素。
	deque<int> dq;//空的队列,不能输出 
	deque<int> dq1(3);//大小为3 的空队列 
	deque<int> dq2(3,12);//三个队列均为12 
	deque<int> dq3(dq2);//复制dq2//参数类型要相同 
	
	for_each(dq1.begin(), dq1.end(), fun);   
	 //for_each()使用需加#include<algorithm>头文件
	for_each(dq2.begin(), dq2.end(), fun);
	for_each(dq3.begin(), dq3.end(), fun);
	
	//用迭代器初始化 
	deque<int>::iterator ite = dq2.begin();//指向dq的头 
	deque<int>::iterator ite1 = dq2.end(); //指向dq的尾 
	deque<int> dq4(ite, ite1);	
	
	for_each(dq4.begin(), dq4.end(), fun);

输出结果:
在这里插入图片描述


属性

大小

  • size()返回元素个数

语法:

size_type size();

size()函数返回双向队列中的元素个数。

  • resize()改变双向队列大小

语法:

void resize( size_type num, TYPE val );

resize()改变双向队列的大小为num,另加入的元素都被填充为val。

  • empty() 判断是否为空

语法:

bool empty();

empty()返回真如果双向队列为空,否则返回假。

deque<int> dq;
	cout << dq.size() << endl;
	deque<int> dq1(3);
	cout << dq1.size() << endl;
	
	dq1.push_front(1);  //在deque的头部加一个元素 
	cout << dq1.size() << endl;
	dq1.push_back(1);  // 在deque的尾部加一个元素 
	cout << dq1.size() << endl;
	
	cout << dq.empty() << endl;
	cout << dq1.empty() << endl; 
	
	dq.resize(1);
	cout << dq.size() << endl;
	dq1.resize(2);  // 将dq1的大小缩小为2 
	cout << dq1.size() << endl;
	dq1.resize(5);  // 将dq1的大小扩大为5 
	cout << dq1.size() << endl;

输出结果为:
在这里插入图片描述

  • clear() 清空

语法:

void clear();

clear()函数删除双向队列中所有元素。

	dq.clear();

操作

1.增

  • push_front() 头部增加

语法:

void push_front( const TYPE &val );

push_front()函数在双向队列的头部加入一个值为val的元素。

  • push_back() 尾部增加

语法:

void push_back( const TYPE &val );

push_back()函数在双向队列的尾部加入一个值为val的元素。

  • insert() 中间增加

语法:

iterator insert( iterator pos, size_type num, const TYPE &val );
void insert( iterator pos, input_iterator start, input_iterator end );

insert()在pos前插入num个val值,或者插入从start到end范围内的元素到pos前面。

	deque<int> dq(1,3);  //初始化一个3 
	dq.push_front(2);   //头部加一个2 
	dq.push_front(1);    //头部加一个1 
	dq.push_back(4);    //尾部加一个4 
	dq.push_back(5);    //尾部加一个5 
	
	for_each(dq.begin(),dq.end(),fun);
	cout <<endl;
	
	dq.insert(dq.begin(),0);   //在头部加一个0 
	dq.insert(dq.begin()+3,3); //在第三个位置加一个3 
	dq.insert(dq.end(),3,6);   //在最后位置加三个6 
	for_each(dq.begin(),dq.end(),fun);

输出结果:
在这里插入图片描述

2.删

  • pop_front() 头部删除

语法:

void pop_front();

pop_front()删除双向队列头部的元素。

  • pop_back() 尾部删除

语法:

void pop_back();

pop_back()删除双向队列尾部的元素。

	deque<char> dq1;
	for(int i=0;i<9;i++){
		dq1.push_back( i + 65); 
	}
	for(int i=0;i<9;i++){
		dq1.pop_back();
		for(int i=0;i<dq1.size();i++)
		cout << dq1[i];
		cout << endl;
	}
	
//或者用迭代器 	
//	int size1 = dq1.size();
//	deque<char>::iterator theIterator;
//	for( int i=0; i < size1; i++ ) {
//  		dq1.pop_back();
//  	for( theIterator = dq1.begin(); theIterator != dq1.end(); theIterator++ )
//      	cout << *theIterator;
//  		cout << endl;
//	}
	
	deque<char> dq2;
	for(int i=0;i<9;i++){
		dq2.push_back( i + 65); 
	}
	for(int i=0;i<9;i++){
		dq2.pop_front();
		for(int i=0;i<dq2.size();i++)
		cout << dq2[i];
		cout << endl;
	}
//	或者用迭代器 	
//  int size2= dq2.size();
//	deque<char>::iterator startIterator;
//	deque<char>::iterator tempIterator;
//	for( int i=0; i < size2; i++ ){
//		startIterator = dq2.begin();
//		dq2.pop_front();
//		for( tempIterator = dq2.begin(); tempIterator != dq2.end(); tempIterator++ )
//  			cout << *tempIterator;
//   		cout << endl;
//	}	

输出结果:
在这里插入图片描述

  • erase() 删除指定元素

语法:

iterator erase( iterator pos );
iterator erase( iterator start, iterator end );

erase()函数删除pos位置上的元素,或者删除start和end之间的所有元素。返回值是一个iterator,指向被删除元素的后一个元素。

deque<char> dq3; 
	for(int i=0;i<10;i++){
		dq3.push_back(i+65);
	}
	int size3=dq3.size();
	for(int i=0;i<dq.size3();i++){
		dq3.erase(dq3.begin());
		for(int i=0;i<size3;i++)
			cout << dq3[i];
			cout << endl;
	}
//	或者用迭代器 	
//	deque<char>::iterator startIterator;
//	deque<char>::iterator tempIterator;
//	for( int i=0; i < size3; i++ ){
//		startIterator = vec1.begin();
//		dq3.erase(startIterator);
//		for( tempIterator = dq3.begin(); tempIterator != dq3.end(); tempIterator++ )
//  			cout << *tempIterator;
//   		cout << endl;
//
//	}

输出结果:
在这里插入图片描述

3.改

  • assign() 修改值

语法:

void assign( input_iterator start, input_iterator end);
void assign( Size num, const TYPE &val );

assign()函数用start和end指示的范围为双向队列赋值,或者设置成num个val。

deque<int> dq;
	deque<int> dq1(5,1);
	dq.assign(dq1.begin(),dq1.begin()+3);
	//将dq1的前三个值赋值给dq
	for_each(dq.begin(),dq.end(),fun); 
	
	dq1.assign(3,6);
	//将三个6赋值给vec1,并将之前vec1的内容清除
	for_each(dq1.begin(),dq1.end(),fun)

在这里插入图片描述

  • swap() 交换

语法:

void swap( deque &target );

swap()函数交换target和现双向队列中元素

	dq.swap(dq1);

4.查

1.返回Vector首个元素

  • begin()

语法:

iterator begin();

begin()函数返回一个迭代器,指向双向队列的第一个元素。

  • front()

语法:

reference front();

front()函数返回一个引用,指向双向队列的头部。

2.返回Vector最后一个元素

  • end()

语法:

iterator end();

end()函数返回一个迭代器,指向双向队列的尾部。

  • back()

语法:

reference back();

back()返回一个引用,指向双向队列中最后一个元素。

3.返回指定位置

  • at()

语法:

reference at( size_type pos );

at()函数返回一个引用,指向双向队列中位置pos上的元素。
4.全部输出

  • for_each()函数

需要用到头文件#include<algorithm>


上面的具体代码如下:

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std; 

void fun(int i)
{
	cout << i << endl;
 } 

void DequeDefine()
{
	
	deque<int> dq;  //定义int型双端队列 
	deque<string> dq1;//定义string型队列 
	deque<char> dq2;// 定义char型队列 
//	struct STU{
//		int age;
//		int y;
//	};
//	deque<struct STU> dq3;   //定义结构型队列
	
}

//构造函数 
void DequeConstructor()
{
	deque<int> dq;//空的队列,不能输出 
	deque<int> dq1(3);//大小为3 的空队列 
	deque<int> dq2(3,12);//三个队列均为12 
	deque<int> dq3(dq2);//复制dq2//参数类型要相同 
	
	for_each(dq1.begin(), dq1.end(), fun);   
	 //for_each()使用需加#include<algorithm>头文件
	for_each(dq2.begin(), dq2.end(), fun);
	for_each(dq3.begin(), dq3.end(), fun);
	
	//用迭代器初始化 
	deque<int>::iterator ite = dq2.begin();//指向dq的头 
	deque<int>::iterator ite1 = dq2.end(); //指向dq的尾 
	deque<int> dq4(ite, ite1);	
	
	for_each(dq4.begin(), dq4.end(), fun);
} 

//属性
void  DequeAttribute()
{
	deque<int> dq;
	cout << dq.size() << endl;
	deque<int> dq1(3);
	cout << dq1.size() << endl;
	
	dq1.push_front(1);  //在deque的头部加一个元素 
	cout << dq1.size() << endl;
	dq1.push_back(1);  // 在deque的尾部加一个元素 
	cout << dq1.size() << endl;
	
	cout << dq.empty() << endl;
	cout << dq1.empty() << endl; 
	
	dq.resize(1);
	cout << dq.size() << endl;
	dq1.resize(2);  // 将dq1的大小缩小为2 
	cout << dq1.size() << endl;
	dq1.resize(5);  // 将dq1的大小扩大为5 
	cout << dq1.size() << endl;
	
	dq.clear();
	cout << dq.empty() << endl; 
	
}

//操作
void DequeAdd()
{
	deque<int> dq(1,3);  //初始化一个3 
	dq.push_front(2);   //头部加一个2 
	dq.push_front(1);    //头部加一个1 
	dq.push_back(4);    //尾部加一个4 
	dq.push_back(5);    //尾部加一个5 
	
	for_each(dq.begin(),dq.end(),fun);
	cout <<endl;
	
	dq.insert(dq.begin(),0);   //在头部加一个0 
	dq.insert(dq.begin()+3,3); //在第三个位置加一个3 
	dq.insert(dq.end(),3,6);   //在最后位置加三个6 
	for_each(dq.begin(),dq.end(),fun);
}

//删
void DequeDel()
{
	deque<char> dq1;
	for(int i=0;i<9;i++){
		dq1.push_back( i + 65); 
	}
	for(int i=0;i<9;i++){
		dq1.pop_back();
		for(int i=0;i<dq1.size();i++)
		cout << dq1[i];
		cout << endl;
	}
	
//或者用迭代器 	
//	int size1 = dq1.size();
//	deque<char>::iterator theIterator;
//	for( int i=0; i < size1; i++ ) {
//  		dq1.pop_back();
//  	for( theIterator = dq1.begin(); theIterator != dq1.end(); theIterator++ )
//      	cout << *theIterator;
//  		cout << endl;
//	}
	
	deque<char> dq2;
	for(int i=0;i<9;i++){
		dq2.push_back( i + 65); 
	}
	for(int i=0;i<9;i++){
		dq2.pop_front();
		for(int i=0;i<dq2.size();i++)
		cout << dq2[i];
		cout << endl;
	}
//	或者用迭代器 	
//  int size2= dq2.size();
//	deque<char>::iterator startIterator;
//	deque<char>::iterator tempIterator;
//	for( int i=0; i < size2; i++ ){
//		startIterator = dq2.begin();
//		dq2.erase(startIterator);
//		for( tempIterator = dq2.begin(); tempIterator != dq2.end(); tempIterator++ )
//  			cout << *tempIterator;
//   		cout << endl;
//
//	}	

	deque<char> dq3; 
	for(int i=0;i<10;i++){
		dq3.push_back(i+65);
	}
	int size3=dq3.size();
	for(int i=0;i<size3;i++){
		dq3.erase(dq3.begin());
		for(int i=0;i<dq3.size();i++)
			cout << dq3[i];
		cout << endl;
	}
//	或者用迭代器 	
//	deque<char>::iterator startIterator;
//	deque<char>::iterator tempIterator;
//	for( int i=0; i < size3; i++ ){
//		startIterator = vec1.begin();
//		dq3.erase(startIterator);
//		for( tempIterator = dq3.begin(); tempIterator != dq3.end(); tempIterator++ )
//  			cout << *tempIterator;
//   		cout << endl;
//
//	}
}

//改
void DequeChange()
{
	deque<int> dq;
	deque<int> dq1(5,1);
	dq.assign(dq1.begin(),dq1.begin()+3);
	//将dq1的前三个值赋值给dq
	for_each(dq.begin(),dq.end(),fun); 
	
	dq1.assign(3,6);
	//将三个6赋值给vec1,并将之前vec1的内容清除
	for_each(dq1.begin(),dq1.end(),fun); 	
	
	dq.swap(dq1);
 } 


int main()
{
	//DequeConstructor();
	//DequeAttribute();
	//DequeAdd(); 
	//DequeDel();
	DequeChange();
		
	system("pause");
	return 0;
 } 
原创文章 50 获赞 139 访问量 2万+

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/104343023