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;
}
相关推荐
Skrrapper1 小时前
【C++】STL:Stack详解
开发语言·c++
知识分享小能手1 小时前
微信小程序入门学习教程,从入门到精通,微信小程序页面制作(2)
前端·javascript·学习·微信小程序·小程序·前端框架·notepad++
lightqjx1 小时前
【C++】vector 使用和实现
开发语言·c++
.鸣1 小时前
idea学习日记10: 字符串相关类的底层原理
java·学习
蓝桉~MLGT1 小时前
Python学习历程——基础语法(print打印、变量、运算)
开发语言·python·学习
Stream_Silver2 小时前
《LangChain入门指南》学习笔记1:第1章 LangChain:开启大语言模型时代的钥匙
笔记·学习·langchain
楼田莉子2 小时前
C++学习:C++类型转换专栏
开发语言·c++·学习
liujing102329292 小时前
Day03_STM32F103C8T6学习笔记6-9章(江科大)
笔记·stm32·学习
魔芋红茶2 小时前
RuoYi 学习笔记 3:二次开发
java·笔记·学习
AI绘画哇哒哒2 小时前
实战:SQL统一访问200+数据源,构建企业级智能检索与RAG系统(下)
人工智能·sql·深度学习·学习·ai·程序员·大模型