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来存储历史状态。

结束语

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

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

十分感谢!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯】:蓝桥杯之路径之谜

题目分析 这是一道路径谜题&#xff0c;描述了一个骑士在一个(n\times n)方格组成的城堡中行走的问题。骑士从西北角&#xff08;入口&#xff09;走到东南角&#xff08;出口&#xff09;&#xff0c;可以横向或纵向移动&#xff0c;但不能斜着走&#xff0c;也不能跳跃。每走…

Mybatis 入门

Mybatis 入门 一、简介 mybatis 是一个优秀的基于 java 的持久层框架&#xff0c;它内部封装了 jdbc&#xff0c;使开发者只需要关注 sql 语句本身&#xff0c; 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 mybatis 通过 xml 或注解的方式将要…

《Java核心技术 卷II》流的创建

流的创建 Collection接口中stream方法可以将任何集合转换为一个流。 用静态Stream.of转化成数组。 Stream words Stream.of(contents.split("\\PL")); of方法具有可变长参数&#xff0c;可以构建具有任意数量的流。 使用Array.stream(array,from,to)可以用数组…

uniapp:微信小程序文本长按无法出现复制菜单

一、问题描述 在集成腾讯TUI后&#xff0c;为了能让聊天文本可以复制&#xff0c;对消息组件的样式进行修改&#xff0c;主要是移除下面的user-select属性限制&#xff1a; user-select: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms…

UFS供电

UFS device结构图如上所示&#xff0c;可以看到有三路电源&#xff1a;VCC&#xff0c;VCCQ和VCCQ2。定义如下&#xff1a; 这三路电压参数如下&#xff1a; 上电时序如下所示&#xff1a; 但实际使用的UFS device产品&#xff0c;可能与spce略有不同。我看到的几款三星、美光和…

c++类和对象(六个默认成员函数)

文章目录 一.类的六个默认成员函数二.构造函数1.概念2.特性 三.析构函数1.概念2.特性 四.拷贝构造函数1.概念2.特性 五.赋值操作符重载5.1运算符重载5.2 赋值运算符重载 一.类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#x…

互联网直播点播平台EasyDSS无人机视频推拉流技术实现工地远程监控巡检直播

在建筑行业&#xff0c;施工现场的安全管理和实时监控一直是项目管理中的重点。随着技术的进步&#xff0c;无人机工地直播技术成为了一种新兴的解决方案&#xff0c;它不仅能够提高施工透明度&#xff0c;还能够加强现场安全管理。EasyDSS作为一种先进的流媒体技术平台&#x…

如何使用网络工具进行网络性能评估

网络评估是对IT基础设施的系统评估&#xff0c;以确保它能够很好地满足企业的核心运营需求&#xff0c;确定了基础设施中需要改进的领域&#xff0c;并定义了改进的范围。 网络评估工具分析IT基础设施的各个方面&#xff0c;它通过评估网络设备、网络性能和安全威胁来仔细检查…

【Java项目】基于SpringBoot的【人职匹配推荐系统】

【Java项目】基于SpringBoot的【人职匹配推荐系统】 技术简介&#xff1a;本系统使用采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介&#xff1a;人职匹配推荐系统分为管理员和用户、企业三个权限子模块。 管理员所能使用的功能主要有&#xff1a;首页、个…

ROS2+OpenCV综合应用--10. AprilTag标签码追踪

1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上&#xff0c;增加了小车摄像头云台运动的功能&#xff0c;摄像头会保持标签码在视觉中间而运动&#xff0c;根据这一特性&#xff0c;从而实现标签码追踪功能。 2. 启动 2.1 程序启动前的准备 本次apriltag标签码使…

【Vim Masterclass 笔记03】S03L10 + S03L11:Vim 中的文本删除操作以及 Vim 思维习惯的培养(含 DIY 拓展知识点)

文章目录 Section 3&#xff1a;Vim Essentials&#xff08;Vim 核心知识&#xff09;S03L10 Vim 核心浏览命令同步练习点评课S03L11 Deleting Text and "Thinking in Vim" 文本的删除及 Vim 思维习惯的培养1 删除单个字符2 删除一个单词2.1 推广1&#xff1a;D HJK…

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

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

LeetCode - 初级算法 数组(两个数组的交集 II)

两个数组的交集 II 这篇文章讨论如何求两个数组的交集,并返回结果中每个元素出现的次数与其在两个数组中都出现的次数一致。提供多个实现方法以满足不同场景需求。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定两个整数数组 nums1 和 nums2,以数…

[react]小技巧, ts如何声明点击事件的类型

很简单, 鼠标放到事件上面就行了 如果想知道点击的是什么元素 ,打印他的nodename就行了 不过得断言为html元素才行 const handleClick (e: React.MouseEvent<HTMLDivElement, MouseEvent>) > {console.log(current, (e.target as HTMLElement).nodeName);}; 为什么…

[创业之路-229]:《华为闭环战略管理》-5-平衡记分卡与战略地图

目录 一、平衡记分卡 1. 财务角度&#xff1a; 2. 客户角度&#xff1a; 3. 内部运营角度&#xff1a; 4. 学习与成长角度&#xff1a; 二、BSC战略地图 1、核心内容 2、绘制目的 3、绘制方法 4、注意事项 一、平衡记分卡 平衡记分卡&#xff08;Balanced Scorecard&…

【中间件】docker+kafka单节点部署---zookeeper模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消息中间件介绍1. KRaft模式2. zookeeper模式2.1. 单节点部署安装验证 前言 最近生产环境上准备部署ELFK日志监控&#xff0c;先在测试环境部署单节点kafka验证…

【mysql】linux安装mysql客户端

参考文章&#xff1a; MySQL系列之如何在Linux只安装客户端 linux下安装mysql客户端client MySQL Community Downloads 查看linux版本方法&#xff1a; lsb_release -a cat /proc/version下载文件&#xff1a; rpm -ivh mysql-community-*可以删除错误的包&#xff1a; RP…

怎么在家访问公司服务器?

在日常工作中&#xff0c;特别是对信息技术从业者而言&#xff0c;工作往往离不开公司的服务器。他们需要定期访问服务器&#xff0c;获取一些关键的机密文件或数据。如果您在家办公&#xff0c;并且需要处理未完成的任务&#xff0c;同时需要从公司服务器获取所需的数据&#…

Unity编译Android apk包进度奇慢或gradle报错的解决方案

最近遇到Unity编译Android apk进度卡在"Calling IPostGenerateGradleAndroidProject callbacks"进度一直不变&#xff0c;如下图&#xff1a; 最后提示编译失败&#xff0c;类似错误如下&#xff1a; Picked up JAVA_TOOL_OPTIONS: -Dfile.encodingUTF-8FAILURE: Bu…

【机器学习案列】车牌自动识别系统:基于YOLO11的高效实现

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…