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

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交换两个数组

直接看代码:

尾删和尾插:

输出结果为:

assign和swap:

输出结果为:

insert:

输出结果为:

erase:

输出结果为:

三、deque的应用场景

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

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

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

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

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

 

结束语

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

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

十分感谢!!!

Read more

Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos)

Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos) 在高性能移动应用开发中,本地数据的持久化存储效率往往是决定用户感知流畅度的木桶短板。传统的 SQLite 虽然结构化程度高,但在处理大规模对象关系映射(ORM)时,复杂的 SQL 拼接和反射解析往往会成为性能瓶颈。 ObjectBox 作为一个专为移动设备打造的、跨平台的超高速 NoSQL 数据库,已经成为了许多追求极致体验开发者的首选。而在 Flutter for OpenHarmony 开发中,配合 objectbox_generator,我们可以通过注解驱动的自动化流程,掌握这套高性能数据库的核心用法。 ⚠️ 鸿蒙适配现状提示:截至本文撰写时,ObjectBox 的 Dart 插件尚未提供官方的 OpenHarmony

By Ne0inhk
YOLO可视化界面,目标检测前端QT页面。

YOLO可视化界面,目标检测前端QT页面。

使用PySide6/QT实现YOLOv8可视化GUI页面 在人工智能和计算机视觉领域,YOLO(You Only Look Once)是一种广泛使用的实时目标检测算法。为了直观地展示YOLO算法的检测效果,我们可以使用Python中的PySide6库来创建一个简单的GUI应用程序,将检测结果实时可视化。 本文将指导你如何使用PySide6实现这一功能。 1. 原视频/图片区:上半部分左边区域为原视频/图片展示区; 2. 检测区:上半部分右边区域为检测结果输出展示区; 3. 日志文本框:打印输出操作日志; 4. 加载模型:从本地选择模型pt文件进行加载; 5. 置信度阈值:自定义检测区的置信度阈值; 6. 文件上传:选择目标文件; 7. 开始检测:执行检测程序; 8. 停止:终止检测程序; 一、工具介绍 1、PySide6 PySide6是一款功能强大的GUI(图形用户界面)开发框架,它允许Python开发者使用Qt库的功能来构建跨平台的桌面应用程序。PySide6作为Qt的Python绑定版本,继承了Qt的跨平台特性,支持在Windows、

By Ne0inhk

Android WebRTC 外置摄像头接入实战:从硬件选型到低延迟传输优化

快速体验 在开始今天关于 Android WebRTC 外置摄像头接入实战:从硬件选型到低延迟传输优化 的探讨之前,我想先分享一个最近让我觉得很有意思的全栈技术挑战。 我们常说 AI 是未来,但作为开发者,如何将大模型(LLM)真正落地为一个低延迟、可交互的实时系统,而不仅仅是调个 API? 这里有一个非常硬核的动手实验:基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。 从0到1构建生产级别应用,脱离Demo,点击打开 从0打造个人豆包实时通话AI动手实验 Android WebRTC 外置摄像头接入实战:从硬件选型到低延迟传输优化 一、为什么需要外置摄像头? 在医疗内窥镜、工业质检等专业场景中,设备往往需要: * 特殊光学需求:

By Ne0inhk
告别“文件传阅”,企业级 Web Excel 如何实现真正的多人实时在线协同?

告别“文件传阅”,企业级 Web Excel 如何实现真正的多人实时在线协同?

在企业数字化的今天,Excel 依然是不可撼动的数据处理核心。然而,在传统的业务场景中,我们经常见到这样的画面:一份财务报表在群聊里反复传输,文件名从“结算单.xlsx”演变成“结算单_最终版_张三改_真的最后版.xlsx”;多人共同汇总数据时,必须排队等待,因为“文件正被他人占用”。 这种“文件传阅”式的协作模式,本质上是单机时代的产物。它带来的不仅是效率的低下,更是数据更新延迟、权限冲突以及变更无法追踪等一系列可能引发致命错误的安全隐患。 随着 SpreadJS V19 版本的发布,其**协同插件(Collaboration Add-on)**通过一套成熟的、专为企业级应用设计的协同框架,彻底打破了这一僵局。本文将作为系列文章的第一篇,带你深度走进 SpreadJS 协同功能的核心,探讨它如何助力企业实现真正的多人实时在线协同。 一、 企业级协作的“三大深坑” 在构建 Web 版 Excel

By Ne0inhk