C++ STL 之 deque
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ STL 之 deque相关的知识,希望对你有一定的参考价值。
参考技术A 本节我们将介绍 STL 中的 deque 容器使用。deque<T>,是一个定义在 deque 头文件中的容器模板,可以生成包含 T 类型元素的容器,它以双端队列的形式组织元素,因此可以在容器的头部和尾部高效地添加或删除对象,它可以处理先进先出类型的事务,类似于栈这种数据结构,它的使用和 vector 相似,但 vector 只能在容器末尾处增加和删除元素。
初始化方式:
1.使用默认的构造函数生成 deque 容器,容器中没有任何元素,大小为0,当添加第一个元素,就就会有内存的分配。
2.和 vector 容器在本质上相同类似,可以生成给定元素个数的 deque 容器。
或者
3.可以用初始化列表来生成 deque 容器。
4.也可以用由两个迭代器标识的一段元素来初始化它。
或者
接下来,我们汇总下 deque 容器的初始化。
示例如下:
结果如下:
和 vector 类似,我们可以使用下标索引和 at() 方法进行访问容器内的元素,使用 size() 方法得到容器的大小。
同时 at() 方法比索引方法安全,因为它增加了边界检查,越界时会抛出 out_of_range 异常。
示例如下:
结果如下:
deque 成员函数 front() 和 back() 的用法也和 vector 相同。参考之前 vector 章节内容即可。
我们知道,在 vector 中,有 push_back() 和 pop_back() 方法,可以在 vector 容器的尾部增加和删除元素。
deque 容器不仅能在容器尾部增加和删除元素,在头部也可以增加和删除元素。
除了和 vector —样都有 emplace_back() 函数外,deque 还有成员函数 emplace_front(),可以在序列的开始位置生成新的元素。
和 vector 一样,我们也可以使用 emplace() 或 insert() 在 deque 内部添加或移除元素。
但这个过程相对要慢一些,因为这些操作需要移动容器内现有元素。
emplace():
insert():
之前系列文章中关于 vector 容器的 insert() 函数的使用也适用于 deque 容器。在 deque 的任意位置插入一个元素会让现有的迭代器全部失效,因此需要重新生成迭代器。
deque 的成员函数clear() , erase() 也和 vector 的相同。
clear():
erase():
该部分的内容和 vector 容器大同小异,更详细的可以参考之前关于 vector 方面的博客。
deque 的成员函数 assign() 可以替换现有的所有元素,它有三个重版版本:
注意,此句
不能写成
因为这么做,data_ 的类型会被推导为 initializer_list<const char*>,然而 assign() 需要的是一个 initializer_list<string> 类型的实参,这样就无法通过编译。
当然,我们可以在 assign() 的实参中直接定义初始化列表
这样,data 的内容
将会被初始化成 data_ 的内容
此时,data 的内容为:
assign() 中第一个参数指定了替换当前容器内容的第二个参数的个数
此时,data 的内容为:
最后,我们来看看容器的赋值操作,只要赋值运算的右操作数必须和左操作数是相同类型,就可以完成赋值操作。
示例如下:
结果如下:
至此,deque 的内容暂告一段落了,可以看出,deque 的使用和 vector 其实大同小异,它的特点之一是可以在容器的头部和尾部增加元素,当然由于移动元素,时空代价会略有增加。
deque 容器的部分细节和 vector 很相似,例如删除元素后,迭代器的变化,在之前的博客中也有所介绍,这里就不详细展开了。
C++ stl queue(单端队列)和stl deque(双端队列)的区别(与循环队列的区别)
文章目录
queue示例
#include <queue>
#include <iostream>
using namespace std;
int main()
queue<int> q;
//cout << "队头元素为:" << q.front() << endl; //运行报错,队列必须先判空,下同
//cout << "队尾元素为:" << q.back() << endl;
for (int i = 0; i < 10; i++)
q.push(i);
if (!q.empty())
cout << "队列q非空!" << endl;
cout << "q中有" << q.size() << "个元素" << endl;
cout << "队头元素为:" << q.front() << endl;
cout << "队尾元素为:" << q.back() << endl;
int size = q.size();
for (int j = 0; j < size; j++)
cout << q.front() << " ";
q.pop();
cout << endl;
if (!q.empty())
cout << "队列非空!" << endl;
else
cout << "队列为空!" << endl;
system("pause");
return 0;
deque示例
循环队列?
老看有人自行实现循环队列,但直接用stl queue不就行了,还用自行实现循环队列吗?我有点懵逼
看到篇文章说std::deque被相当仔细地定义为线性队列。它的设计并不真正适合循环队列
,不知是真是假
以上是关于C++ STL 之 deque的主要内容,如果未能解决你的问题,请参考以下文章
6-5-2:STL之stack和queue——双端队列deque
STL标准库 & 范型编程学习笔记:dequequeuestack深度探索