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;
}
相关推荐
QQ同步助手10 分钟前
C++ 指针进阶:动态内存与复杂应用
开发语言·c++
qq_4335545421 分钟前
C++ 面向对象编程:递增重载
开发语言·c++·算法
易码智能29 分钟前
【EtherCATBasics】- KRTS C++示例精讲(2)
开发语言·c++·kithara·windows 实时套件·krts
ཌ斌赋ད36 分钟前
FFTW基本概念与安装使用
c++
薄荷故人_1 小时前
从零开始的C++之旅——红黑树封装map_set
c++
汤姆和佩琦1 小时前
2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。
学习·聚类·sklearn
悲伤小伞2 小时前
C++_数据结构_详解二叉搜索树
c语言·数据结构·c++·笔记·算法
好学近乎知o2 小时前
正则表达式(学习Django过程中可能涉及的)
学习·正则表达式·django
雨中奔跑的小孩2 小时前
爬虫学习案例8
爬虫·学习
jieshenai2 小时前
使用 VSCode 学习与实践 LaTeX:从插件安装到排版技巧
ide·vscode·学习