文章目录
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_type size();
size()函数返回双向队列中的元素个数。
语法:
void resize( size_type num, TYPE val );
resize()改变双向队列的大小为num,另加入的元素都被填充为val。
语法:
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;
输出结果为:
语法:
void clear();
clear()函数删除双向队列中所有元素。
dq.clear();
操作
1.增
语法:
void push_front( const TYPE &val );
push_front()函数在双向队列的头部加入一个值为val的元素。
语法:
void push_back( const TYPE &val );
push_back()函数在双向队列的尾部加入一个值为val的元素。
语法:
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.删
语法:
void pop_front();
pop_front()删除双向队列头部的元素。
语法:
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;
// }
输出结果:
语法:
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.改
语法:
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);
语法:
void swap( deque &target );
swap()函数交换target和现双向队列中元素
dq.swap(dq1);
4.查
1.返回Vector首个元素
语法:
iterator begin();
begin()函数返回一个迭代器,指向双向队列的第一个元素。
语法:
reference front();
front()函数返回一个引用,指向双向队列的头部。
2.返回Vector最后一个元素
语法:
iterator end();
end()函数返回一个迭代器,指向双向队列的尾部。
语法:
reference back();
back()返回一个引用,指向双向队列中最后一个元素。
3.返回指定位置
语法:
reference at( size_type pos );
at()函数返回一个引用,指向双向队列中位置pos上的元素。
4.全部输出
需要用到头文件#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;
}