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;
}
相关推荐
冷崖25 分钟前
MySQL异步连接池的学习(五)
学习·mysql
知识分享小能手27 分钟前
Vue3 学习教程,从入门到精通,Axios 在 Vue 3 中的使用指南(37)
前端·javascript·vue.js·学习·typescript·vue·vue3
No0d1es4 小时前
电子学会青少年软件编程(C/C++)5级等级考试真题试卷(2024年6月)
c语言·c++·算法·青少年编程·电子学会·五级
焄塰5 小时前
Ansible 管理变量和事实
学习·centos·ansible
DjangoJason6 小时前
C++ 仿RabbitMQ实现消息队列项目
开发语言·c++·rabbitmq
oe10196 小时前
读From GPT-2 to gpt-oss: Analyzing the Architectural Advances(续)
笔记·gpt·学习
weixin_307779138 小时前
VS Code配置MinGW64编译GNU 科学库 (GSL)
开发语言·c++·vscode·算法
Include everything9 小时前
Rust学习笔记(三)|所有权机制 Ownership
笔记·学习·rust
杜子不疼.10 小时前
《Python学习之文件操作:从入门到精通》
数据库·python·学习
蒋星熠10 小时前
C++零拷贝网络编程实战:从理论到生产环境的性能优化之路
网络·c++·人工智能·深度学习·性能优化·系统架构