STL学习-顺序容器-deque双端队列

1.deque是一个双端队列,可以在队列的两端进行插入和删除操作它与vector的区别是,deque的两端都开放,因此可以在头尾两端进行快速的插入和删除。

deque的逻辑结构

deque的内部结构

deque的结构定义于命名空间std内的一个class tmplate

cpp 复制代码
namespace std
{
template <typename T,
typename Allocator = allocator<T>>
class deque;
}

deque和vector相比,有如下特点:

1.两端都能快速的插入和删除元素(vector只能在尾部快速的插入和删除数据),

2.deque的内存重分配优于vector,因为从其内部结构可以看出,deque在扩容时不必复制所有数据,而vector在内存重新分配时需要复制所有的数据。
deque和vector相似的地方:

1.在中间插入和删除数据速度相对较慢,因为要移到其它的数据,

2.迭代器属于随机访问迭代器

总之,需要频繁的在两端插入或删除数据时,请使用deque。

2.定义及初始化

deque对象的常用方法

cpp 复制代码
#include <iostream>
#include <deque>
using namespace std;
//输出双端队列d的所有数据
void Show(const deque<int>& d)
{
for(const auto&x:d)
cout<<x<<" ";
cout<<endl;
}

int main()
{
deque<int>d0;//创建一个空的双端队列
deque<int>d1(3);//创建一个包含3个8的双端队列
deque<int>d2(4,2);//创建一个包含4个2的双端队列
deque<int>d3{1,2,3,4,5};//创建包含1,2,3,4,5的双端队列
cout<<"d0:";Show(d0);
cout <<"d1:"; show(d1);
cout <<"d2:";Show(d2);
cout <<"d3:";Show(d3);
retur 0;
}

向deque中添加元素(利用push_front,push_back)

例如:

cpp 复制代码
//输出双端队列d的所有数据
void Show(const deque<int>& d)
{
for(const auto&x:d)
Cout<< x <<" ";
cout << endl;
}
int main()
{
deque<int> d;//创建一个空的双端队列
d.push_front(1);//头部插入1
d.push_front(2);//头部插入2
d.push_front(3);//头部插入3
d.push_back(10);//尾部插入10
d.push_back(20);//尾部插入20
d.push_back(30);//尾部插入30
Show(d);//输出d的数据
return 0;
}

3.deque常用迭代器

例如利用迭代器访问deque元素:

cpp 复制代码
int main()
{
deque<int> d{1,2,3,4,5};
//从头到尾输出d的数据
cout <<"从头到尾:";
for(deque<int>::const iterator it= d.cbegin();it != d.cend(); ++it)
cout<< *it <<" ";
cout << endl;
//所有数据扩大2倍
for(auto it=d.begin();it != d.end(); ++it)
*it *= 2;
//也可以使用范围for
//for(auto&x:d)
// x*= 2;
//从后往前输出
cout<<"从后往前:"";
for(auto it= d.rbegin();it != d.rend();++it)//也可以使用crbegin()和crend
cout << *it <<
cout << endl;
return 0;
}

4.deque常用运算符

例如:

cpp 复制代码
//输出双端队列d的所有数据
void Show(const deque<int>& d)
{
for(auto&x:d)
cout << x<<" ";
cout << endl;
}
int main()
{
deque<int>q1{1,2,3,4,5};
deque<int>q2;
92= q1;//把q1的值全部赋值给q2
cout << "q1:";
Show(q1);
cout <<"q2:";
Show(q2);
if(q1 == q2)//判断q1是否等于q2
cout<<"q1==q2"<< endl << endl;
q1[1]= 50;//通过[]修改q1的元素
cout<<"q1[1]=50后"<<endl <<"q1:";
Show(q1);
cout <<"q2:";
Show(q2);
if(q1 != q2)//判断两个deque对象是否不相等
cout <<"q1 != q2"<< endl;
if(q1 < q2)//判断q1,q2的大小
cout<<"q1< q2"<< endl;
else if(q1 >q2)
cout<<"q1 >q2"<< endl;
else
cout<<"q1 == q2"<< endl;

return 0;
}

5.deque常用成员函数

empty成员函数 判断deque对象是否为空
front成员函数 获取第一个元素的引用。
back成员函数获取最后一个元素的引用。

push_front成员函数 往头部插入数据。容量不够会自动扩容。
pop_front成员函数从头部删除数据

push_back成员函数 尾部插入数据。可以自动扩容。
pop_back成员函数尾部删除数据。

6.扩展:如何动态创建二维数组

cpp 复制代码
#include <iostream>
int main()
{
//定义数组的行数和列数
const int rows =3;
const int cols = 4;
// 动态分配内存来创建二维数组
int** arr = new int*[rows];
for(int i=0;i<rows;++i){ //动态创建每-行
arr[i]= new int[cols];
}
//初始化二维数组
for(int i=0;i<rows;++i)
{
for(int j=0;j<cols;++j)
{
arr[i][j]=i * cols +j;// 进行赋值,值不重要
}
}
//打印二维数组
for(int i=0;i<rows;++i)
{
for(int j=0;j<cols;++j)
{
cout<< arr[i][j]<<" ";
}
cout << endl;
}
//释放动态分配的内存
for(int i=0;i<rows;++i)
{
delete[] arr[i];
}
delete[] arr;
return 0;
}
相关推荐
nashane4 小时前
HarmonyOS 6学习:应用签名文件丢失处理与更新完全指南
学习·华为·harmonyos·harmonyos 5
@codercjw4 小时前
公差的具体标注方法(书本上/理论上标注方法)
学习
A7bert7774 小时前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测
li1670902704 小时前
第二十七章:智能指针
c语言·数据结构·c++·visual studio
久菜盒子工作室4 小时前
时寒冰:第五次产业大转移与未来30年国运:在“双向挤压”中实现惊险一跃
人工智能·学习
王老师青少年编程5 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
zh_xuan5 小时前
libcurl调用https接口
c++·libcurl
就叫飞六吧5 小时前
QT写一个桌面程序exe并动态打包基本流程(c++)
开发语言·c++
蜡笔小马5 小时前
1.c++设计模式-工厂模式
c++
汉克老师6 小时前
GESP2025年3月认证C++五级( 第三部分编程题(2、原根判断))
c++·算法·模运算·gesp5级·gesp五级·原根·分解质因数