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;
}
相关推荐
长潇若雪6 分钟前
结构体(C 语言)
c语言·开发语言·经验分享·1024程序员节
东林知识库18 分钟前
2024年10月HarmonyOS应用开发者基础认证全新题库
学习·华为·harmonyos
随便取个六字28 分钟前
C++学习:类和对象(二)
c++·学习
DARLING Zero two♡40 分钟前
关于我、重生到500年前凭借C语言改变世界科技vlog.12——深入理解指针(2)
c语言·开发语言·科技·1024程序员节
jimmy.hua1 小时前
C++刷怪笼(9)继承
开发语言·c++
OMGmyhair1 小时前
【 C++ 】C++11的初步学习
开发语言·c++·学习
独行soc1 小时前
#渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶之Jenkins组件
安全·jenkins·安全威胁分析·1024程序员节·shodan
dawn1912282 小时前
Java 中的正则表达式详解
java·开发语言·算法·正则表达式·1024程序员节
黑不拉几的小白兔2 小时前
PTA L1系列题解(C语言)(L1_097 -- L1_104)
数据结构·算法·1024程序员节
l1x1n02 小时前
【IT基础中英笔记】符号系统与数据类型 | CompTIA ITF+
笔记·学习