文章目录
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;
输出结果为: