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(双端队列)的区别(与循环队列的区别)

参考文章1:c++基础之queue和deque比较

参考文章2:C++ queue 和 deque的区别

参考文章3:C++ 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;

参考文章:C++队列(queue、deque)

deque示例

参考文章3:C++ STL deque容器(详解版)

循环队列?

老看有人自行实现循环队列,但直接用stl queue不就行了,还用自行实现循环队列吗?我有点懵逼

看到篇文章说std::deque被相当仔细地定义为线性队列。它的设计并不真正适合循环队列,不知是真是假

参考文章:c++ - 使用 STL 队列的循环队列?

以上是关于C++ STL 之 deque的主要内容,如果未能解决你的问题,请参考以下文章

C++STL之stack和queue以及deque详解

6-5-2:STL之stack和queue——双端队列deque

C++ stack&queue

STL标准库 & 范型编程学习笔记:dequequeuestack深度探索

STL标准库 & 范型编程学习笔记:dequequeuestack深度探索

C++之STL总结精华笔记