C++——deque的了解和使用

目录

引言

标准库中的deque

一、deque的基本概念

二、deque的常用接口

1.deque的迭代器

2.deque的初始化

3.deque的容量操作

3.1 有效长度和容量大小

3.2 有效长度和容量操作

4.deque的访问操作

5.deque的修改操作

三、deque的应用场景

结束语


引言

在C++中,deque是STL(标准模板库)提供的一种容器类,专门用于存储各种类型的元素,并支持在两端进行快速的插入和删除操作。今天我们就试着来学习一下这一数据结构。

标准库中的deque

一、deque的基本概念

Deque是一种线性数据结构,它允许在两端进行插入和删除操作。这两端通常被称为前端(front)和后端(rear),或者端点1和端点2。Deque的灵活性在于,它既可以用作队列(FIFO,先进先出),也可以用作栈(LIFO,后进先出),具体取决于元素的插入和删除操作是在哪一端进行的。deque是C++STL(标准模板库)中的一种容器,可以用于存储各种类型的元素。deque的特点是可以在队列的两端进行元素的操作,并且可以高效地在队列的任意位置进行元素的插入和删除操作。

二、deque的常用接口

1.deque的迭代器

与string和vector类似,deque也有迭代器。

由于deque定义在deque类中,因此我们想要使用deque的迭代器需要通过域作用限定符访问——deque<类型>::iterator 。

其中,begin(),end(),rbeign(),rend()的使用访问方法与string和vector的使用方法类似。

我们来看代码:

int main()
{
	deque<int> d = { 0,1,2,3,4, };
	deque<int>::iterator it = d.begin();
	cout << "顺序遍历:";
	while (it != d.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	cout << "逆序遍历:";
	deque<int>::reverse_iterator rit = d.rbegin();
	while (rit != d.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	return 0;
}

输出结果为:

2.deque的初始化

来看代码演示:

void Print(deque<int>& d)
{
	for (deque<int>::iterator it = d.begin(); it != d.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}

int main()
{
	deque<int> d1;
	for (int i = 0; i < 5; ++i)
	{
		d1.push_back(i);
	}
	deque<int> d2(d1.begin(), d1.end());
	deque<int> d3(5, 5);
	deque<int> d4(d3);
	cout << "打印d1: ";
	Print(d1);
	cout << "打印d2: ";
	Print(d2);
	cout << "打印d3: ";
	Print(d3);
	cout << "打印d4: ";
	Print(d4);

	return 0;
}

输出结果为:

3.deque的容量操作

下面是关于deque的容量操作:

函数名称功能
size返回deque的有效长度
clear清空deque
empty检查deque是否为空,是则返回ture,否则返回false
resize重新设置有效元素的数量,超过原来有效长度则用c字符填充
3.1 有效长度和容量大小

deque没有capacity接口。deque,即双端队列(Double Ended Queue),是一个双向开口的连续线性空间,允许在头尾两端分别进行插入和删除操作。其特性决定了它不需要像某些其他数据结构(如vector)那样具有固定的容量(capacity)概念。

下面是简单的测试用例:

int main()
{
	deque<int> d = { 0,1,2,3,4 };
	cout << d.size() << endl;
	if (d.empty())
	{
		cout << "d为空" << endl;
	}
	else
	{
		cout << "d不为空" << endl;
	}
	d.clear();
	if (d.empty())
	{
		cout << "d为空" << endl;
	}
	else
	{
		cout << "d不为空" << endl;
	}

	return 0;
}
3.2 有效长度和容量操作

deque这个容器没有提供reserve接口,接下来我们来学习一下resize这个接口:

resize()与我们之前学习的string、vector用法一致,在这里就不多介绍了

来看代码演示:

int main()
{
	deque<int> d = { 1,2,3,4,5 };
	d.resize(3);
	for (int i = 0; i < d.size(); i++)
	{
		cout << d[i] << " ";
	}
	cout << endl;

	d.resize(4);
	for (int i = 0; i < d.size(); i++)
	{
		cout << d[i] << " ";
	}
	cout << endl;


	d.resize(5, 9);
	for (int i = 0; i < d.size(); i++)
	{
		cout << d[i] << " ";
	}
	cout << endl;
	return 0;
}

输出结果为:

4.deque的访问操作
函数名称功能
operator[]返回指定位置的元素,越界则报错
at返回指定位置的元素,越界则抛异常
front返回字符串第一个元素
back返回字符串最后一个元素

这部分内容和之前学习的vector容器部分内容差不多

int main()
{
	deque<int> d = { 0,1,2,3,4,5,6,7,8,9 };
	for (int i = 0; i < d.size(); i++)
	{
		cout << d[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < d.size(); i++)
	{
		cout << d.at(i) << " ";
	}
	cout << endl;
	cout << "front:" << d.front() << endl;
	cout << "back:" << d.back() << endl;
	return 0;
}

输出结果:

5.deque的修改操作

deque的修改操作有如下几个:

函数名称功能
push_back在数组后追加元素
pop_back删除数组最后一个元素
insert在指定位置追加元素
assign使用指定数组替换原数组
erase删除数组指定部分区间
swap交换两个数组

直接看代码:

尾删和尾插:

int main()
{
	deque<int> d = { 0,1,2,3,4,5,6,7,8,9 };
	for (int i = 0; i < d.size(); i++)
	{
		cout << d.at(i) << " ";
	}
	cout << endl;
	d.push_back(10);
	for (int i = 0; i < d.size(); i++)
	{
		cout << d.at(i) << " ";
	}
	cout << endl;
	d.pop_back();
	for (int i = 0; i < d.size(); i++)
	{
		cout << d.at(i) << " ";
	}
	cout << endl;
	
	return 0;
}

输出结果为:

assign和swap:

int main()
{
	deque<int> d1 = { 9,9,9,9,9 };
	d1.assign(3, 3);
	for (int i = 0; i < d1.size(); i++)
	{
		cout << d1[i] << " ";
	}
	cout << endl;
	deque<int> d2 = { 1,1,1,1,1 };
	d1.swap(d2);
	for (int i = 0; i < d1.size(); i++)
	{
		cout << d1[i] << " ";
	}
	cout << endl;

	for (int i = 0; i < d2.size(); i++)
	{
		cout << d2[i] << " ";
	}
	cout << endl;

	return 0;
}

输出结果为:

insert:

int main()
{
	deque<int> d1(5, 10);
	deque<int>::iterator it = d1.begin();
	it = d1.insert(it, 100);
	cout << "d1:";
	for (it = d1.begin(); it < d1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

	d1.insert(it, 2, 1000);
	it = d1.begin();
	cout << "d1:";
	for (it = d1.begin(); it < d1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

	deque<int> d2(2, 10000);

	it = d1.begin();
	d1.insert(it + 2, d2.begin(), d2.end());
	cout << "d1:";
	for (it = d1.begin(); it < d1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

	return 0;
}

输出结果为:

erase:

int main()
{
	deque<int> d = { 0,1,2,3,4,5,6,7,8,9 };
	deque<int>::iterator it = d.erase(d.begin() + 3);	// 删除值为3的元素
	it = d.erase(it);	// 删除值为4的元素
	for (int i = 0; i < d.size(); i++)
	{
		cout << d[i] << " ";
	}
	cout << endl;

	it = d.erase(d.begin(), d.begin() + 5);
	for (int i = 0; i < d.size(); i++)
	{
		cout << d[i] << " ";
	}
	cout << endl;

	return 0;
}

输出结果为:

三、deque的应用场景

1.缓存机制:在需要频繁从两端添加或移除元素的场景下,如浏览器历史记录、消息队列等,deque能高效地处理数据。

2.任务调度:在并发编程中,deque可以用于线程池的任务队列,既能快速添加新的任务,也能方便地取出已完成的任务进行后续处理。

3.算法实现:许多排序算法,比如循环队列、滑动窗口算法等,会用到deque来进行辅助存储。

4.游戏开发:游戏中角色的行动序列、回合制系统的牌堆管理等也常使用deque。

5.文本编辑器:滚动条下方的撤销/重做功能,也可以利用deque来存储历史状态。

结束语

没啥时间写博客,浅浅水一篇吧~

感谢大佬支持,求点赞收藏评论关注!!!

十分感谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945885.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用R语言绘制交互地图

在现代地理信息系统&#xff08;GIS&#xff09;应用中&#xff0c;交互地图成为了数据展示的重要工具。相比传统的静态地图&#xff0c;交互地图不仅能够更生动地呈现空间数据&#xff0c;还能增强用户的参与感和数据探索性。本文将介绍如何使用R语言绘制交互地图&#xff0c;…

支持向量机入门指南:从原理到实践

目录 1 支持向量机的基本概念 1.2 数学表达 2 间隔与支持向量 2.1 几何间隔 2.2 支持向量的概念 2.3 规范化超平面 2.4 支持向量的深入分析 2.4.1 支持向量的特征 2.4.2 支持向量的作用 2.4.3 支持向量的代数表示 2.5 KKT条件 3 最优化问题 3.1 问题的形成 3.2 规…

【时时三省】(C语言基础)动态内存函数calloc

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 calloc calloc函数也用来动态内存分配 原型如下: void* calloc&#xff08;size&#xff3f;t num, size&#xff3f;t size&#xff09;&#xff1b; 它们两个的区别是 它是需要两个参数…

Flutter中添加全局防护水印的实现

随着版权意识的加强&#xff0c;越来越多的应用开始在应用内部增加各种各样的水印信息&#xff0c;防止核心信息泄露&#xff0c;便于朔源。 效果如下&#xff1a; 在Flutter中增加全局水印的方式&#xff0c;目前有两种实现。 方案一&#xff0c;在native层添加一个遮罩层&a…

uniapp - 小程序实现摄像头拍照 + 水印绘制 + 反转摄像头 + 拍之前显示时间+地点 + 图片上传到阿里云服务器

前言 uniapp&#xff0c;碰到新需求&#xff0c;反转摄像头&#xff0c;需要在打卡的时候对上传图片加上水印&#xff0c;拍照前就显示当前时间日期地点&#xff0c;拍摄后在呈现刚才拍摄的图加上水印&#xff0c;最好还需要将图片上传到阿里云。 声明 水印部分代码是借鉴的…

图像处理-Ch7-小波函数

个人博客&#xff01;无广告观看&#xff0c;因为这节内容太多了&#xff0c;有点放不下&#xff0c;分了三节 文章目录 多分辨率展开(Multi-resolution Expansions)序列展开(Series Expansions)尺度函数(Scaling Function)例&#xff1a;哈尔尺度函数(Haar scaling func)多分…

本地小主机安装HomeAssistant开源智能家居平台打造个人AI管家

文章目录 前言1. 添加镜像源2. 部署HomeAssistant3. HA系统初始化配置4. HA系统添加智能设备4.1 添加已发现的设备4.2 添加HACS插件安装设备 5. 安装cpolar内网穿透5.1 配置HA公网地址 6. 配置固定公网地址 前言 大家好&#xff01;今天我要向大家展示如何将一台迷你的香橙派Z…

Rocky Linux下安装meld

背景介绍&#xff1a; meld是一款Linux系统下的用于 文件夹和文件的比对软件&#xff0c;非常常用&#xff1b; 故障现象&#xff1a; 输入安装命令后&#xff0c;sudo yum install meld&#xff0c;报错。 12-31 22:12:17 ~]$ sudo yum install meld Last metadata expirat…

数据结构与算法之动态规划: LeetCode 337. 打家劫舍 III (Ts版)

打家劫舍 III https://leetcode.cn/problems/house-robber-iii/description/ 描述 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连一番侦察之后&#xff0c;聪明的小…

chatwoot 开源客服系统搭建

1. 准备开源客服系统&#xff08;我是用的Chatwoot &#xff09; 可以选择以下开源客服系统作为基础&#xff1a; Chatwoot: 功能强大&#xff0c;支持多渠道客户对接&#xff0c;&#xff08;支持app&#xff0c;web&#xff09;。Zammad: 现代的开源工单系统。FreeScout: 免…

sentinel-请求限流、线程隔离、本地回调、熔断

请求限流&#xff1a;控制QPS来达到限流的目的 线程隔离&#xff1a;控制线程数量来达到限流的目录 本地回调&#xff1a;当线程被限流、隔离、熔断之后、就不会发起远程调用、而是使用本地已经准备好的回调去提醒用户 服务熔断&#xff1a;熔断也叫断路器&#xff0c;当失败、…

鸿蒙开发-ArkTS中使用Path组件

在ArkTS中使用Path组件&#xff0c;可以按照以下步骤进行&#xff1a; 一、了解Path组件 Path组件用于根据绘制路径生成封闭的自定义形状。该组件从API Version 7开始支持&#xff0c;并随着后续版本的更新可能增加新的功能。Path组件支持多种属性和方法&#xff0c;用于定义…

高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程

前言 Nginx WebUI 是一个为 Nginx 提供图形化管理界面的工具。通过 WebUI&#xff0c;用户可以轻松管理 Nginx 配置&#xff0c;而无需直接编辑配置文件&#xff0c;尤其适合新手用户和频繁修改配置的场景。 官网文档&#xff1a;nginxWebUI - 文档 本文将分享为什么选择 ngin…

Linux网络 | 理解Web路径 以及 实现一个简单的helloworld网页

前言&#xff1a;本节内容承接上节课的http相关的概念&#xff0c; 主要是实现一个简单的接收http协议请求的服务。这个程序对于我们理解后面的http协议的格式&#xff0c;报头以及网络上的资源的理解&#xff0c; 以及本节web路径等等都有着重要作用。 可以说我们就用代码来理…

2.5万字 - 用TensorFlow和PyTorch分别实现五种经典模型

在深度学习领域&#xff0c;TensorFlow和PyTorch是两大广泛使用的框架&#xff0c;各有其独特的特性和优势。随着人工智能技术的快速发展&#xff0c;越来越多的开发者需要熟练掌握这两种工具&#xff0c;以便在实际项目中选择适合的框架进行高效开发。 目录 入门友好介绍 Te…

【C++】2029:【例4.15】水仙花数

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;我的做法思路分析优势不足之处 &#x1f4af;老师的做法思路分析优势不足 &#x1f4af;对比和优化实现方式对比优化思路和操作1. 直接分解数字的各位…

结合长短期记忆网络(LSTM)和无迹卡尔曼滤波器(UKF)的技术在机器人导航和状态估计中的应用前景

结合长短期记忆网络(LSTM)和无迹卡尔曼滤波器(UKF)的技术在机器人导航和状态估计中具有广泛的应用前景。如有滤波、导航方面的代码定制需求,可通过文末卡片联系作者获得帮助 文章目录 结合LSTM和UKF的背景结合LSTM和UKF的优势应用实例研究现状MATLAB代码示例结论结合LSTM和…

Android14 CTS-R6和GTS-12-R2不能同时测试的解决方法

背景 Android14 CTS r6和GTS 12-r1之后&#xff0c;tf-console默认会带起OLC Server&#xff0c;看起来olc server可能是想适配ATS(android-test-station)&#xff0c;一种网页版可视化、可配置的跑XTS的方式。这种网页版ATS对测试人员是比较友好的&#xff0c;网页上简单配置下…

告别Kibana:Elasticsearch 桌面客户端的新变革

告别Kibana&#xff1a;Elasticsearch 桌面客户端的新变革 在大数据处理与分析领域&#xff0c;Elasticsearch 及其相关技术的应用日益广泛。长期以来&#xff0c;Kibana 在数据可视化与查询管理方面占据重要地位&#xff0c;但随着技术的不断发展&#xff0c;用户对于更高效、…

HTML5实现喜庆的新年快乐网页源码

HTML5实现喜庆的新年快乐网页源码 前言一、设计来源1.1 主界面1.2 关于新年界面1.3 新年庆祝活动界面1.4 新年活动组织界面1.5 新年祝福订阅界面1.6 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现喜庆的新年快乐网页源码&#xff0c;春节新年网…