C++ - deque
博客主页:【夜泉_ly】
本文专栏:【C++】
欢迎点赞👍收藏⭐关注❤️
文章目录
- 💡双端队列简介
- 1. 基本特性
- 2. 与其他容器的比较
- 与 `vector`
- 与 `list`
- 3. 中控数组的设计
- 4. 优缺点
- 优点
- 缺点
- 5. 应用场景
- 6. 结论
💡双端队列简介
双端队列(deque
)是一种特殊的容器,它允许在两端进行插入和删除操作。
虽然它的名称中有“队列”二字,但它的行为并不完全符合传统队列的先进先出(FIFO)原则,因此严格来讲,双端队列不是队列。
下面将介绍双端队列的特性、与其他容器的比较、以及它的应用场景。
1. 基本特性
双端队列是一种支持在头部和尾部同时进行插入和删除操作的容器。
观察它的接口,可以看见它的接口设计允许:
- 在头部和尾部进行高效的插入和删除操作。
- 进行随机访问,支持通过下标访问任意元素。
⭕虽然 deque
看起来非常灵活且功能强大,但在实际使用中,仍需对其存在的潜在问题保持警惕。
这也解释了为什么许多数据结构书籍更多地介绍列表(list
)和向量(vector
),而不单独强调双端队列。
2. 与其他容器的比较
首先来回顾一下顺序表和链表的区别:
特性 | 链表(list) | 顺序表(vector) |
---|---|---|
可任意位置插入删除 | 是 | 否(头、中部插入效率低) |
按需申请释放 | 是 | 需处理扩容问题 |
支持随机访问 | 否 | 是(可用下标随机访问) |
与 vector
- 插入和删除效率:
deque
在头部和尾部的插入和删除操作效率较高,而vector
在这些操作中性能较差。 - 扩容问题:
扩容方面,deque
更优秀。
vector
在扩容时需要将所有数据拷贝到一个新数组中,然后释放旧的数组,这在元素较多时会造成性能损失。
相比之下,deque
使用多个小数组,扩容时只需添加新的数组,避免了大规模的数据拷贝。 - 随机访问:
vector
的效率更高。因为双端队列随机访问时要计算位置。
与 list
- 插入和删除效率:
list
更优秀。
deque
在头部和尾部的插入和删除操作效率较高,而在中间插入删除性能较差。因为需要保证小数组的长度,不能直接扩容,以免加大随机访问时的计算量,大大降低随机访问的效率。 - 扩容问题:
扩容方面,deque
更优秀。
list
虽然不会浪费空间,但大量分散的节点会让内存碎片化。而deque
使用小数组极大改善了这个问题。 - 随机访问:
deque
更优。因为list
根本不支持随机访问🤣。
双端队列在一定程度上结合了两者的优点,允许在两端高效插入和删除,同时也支持下标随机访问。但是在单方面上不如两者极致。
3. 中控数组的设计
在 deque
的实现中,数据通常是以多个小数组的形式存储。这些小数组被一个称为中控数组(或指针数组)的结构连接在一起。中控数组从中间位置开始放置小数组,提供了更灵活的内存管理。由于中控数组只存储小数组的指针,扩容时只需拷贝指针,避免了移动实际数据的开销。
4. 优缺点
优点
-
高效支持头部和尾部的插入与删除。
-
随机访问性能良好,适合频繁需要访问数据的场景。
小数组长度固定,计算位置时,先减去头或尾数组的数据个数,然后一除就能得到位置。
-
适合用作
stack
和queue
的默认容器。C++ -stack、queue适合用于需要频繁在两端插入和删除数据的场景
缺点
- 在中间位置插入或删除操作的效率较低,因为
deque
不支持单独小数组的大小调整。 - 随机访问时的计算不如
vector
高效。但如果数据量较小其实还好。
下面这段代码,对vector
和deque
进行排序,用于比较vector
和deque
在随机访问的效率上的区别:
void TestOP()
{srand(time(0));const int N = 10000000;vector<int> v;deque<int> dq;for (int i = 0; i < N; ++i){int tmp = rand();v.push_back(tmp);dq.push_back(tmp);}int begin1 = clock();sort(v.begin(), v.end());int end1 = clock();int begin2 = clock();sort(dq.begin(), dq.end());int end2 = clock();printf("vector:%d\n", end1 - begin1);printf("deque:%d\n", end2 - begin2);
}
int main()
{TestOP();return 0;
}
运行结果如下图:
可以看到,在数据量较大时,deque
随机访问的效率不如vector
。
5. 应用场景
由于其灵活性和效率,deque
特别适合用于需要频繁在两端插入和删除数据的场景,因此,它是实现栈和队列的一个理想容器,提供了在高频数据操作时的良好性能。
这就是为什么,库中stack
和queue
的默认容器是deque
:
6. 结论
双端队列是一种强大且灵活的数据结构,能够在多种情况下满足开发者的需求。尽管它在特定情况下可能不如列表和向量广泛使用,但了解其特性和应用场景,可以帮助开发者在设计高效算法时做出更明智的选择。
希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!
相关文章:

C++ - deque
博客主页:【夜泉_ly】 本文专栏:【C】 欢迎点赞👍收藏⭐关注❤️ 文章目录 💡双端队列简介1. 基本特性2. 与其他容器的比较与 vector与 list 3. 中控数组的设计4. 优缺点优点缺点 5. 应用场景6. 结论 💡双端队列简…...

国产!瑞芯微米尔RK357核心板革新AIoT设备,8核6T高算力
随着科技的快速发展,AIoT智能终端对嵌入式模块的末端计算能力、数据处理能力等要求日益提高。近日,米尔电子发布了一款基于瑞芯微RK3576核心板和开发板。核心板提供4GB/8GB LPDDR4X、32GB/64GB eMMC等多个型号供选择。瑞芯微RK3576核心优势主要包括高性能…...

中国人寿财险青岛市分公司践行绿色金融,助力可持续发展
中国人寿财险青岛市分公司积极响应国家绿色发展战略,大力推进绿色金融实践。在保险产品创新方面,推出一系列绿色保险产品。如新能源汽车保险,为新能源汽车产业发展提供风险保障,促进交通领域的节能减排。环境污染责任保险则助力企…...

ajax 读取文件
DOMException: Failed to read the responseXML property from XMLHttpRequest: The value is only accessible if the objects responseType is or document (was blob). at XMLHttpRequest.r ( $.ajax({ url: 未来之窗_服务, method: GET, …...

火语言RPA流程组件介绍--开始监听网络请求
🚩【组件功能】:开始监听内置浏览器网络请求(提示:本组件仅适用于火语言内置浏览器) 配置预览 配置说明 匹配网址 可以添加一个或者多个匹配规则用于筛选需要保存的网络请求. 输入输出 输入类型 万能对象类型(Sy…...

CSS综合案例——新闻详情
一、知识点 1、文字颜色 属性名:color 属性值: 颜色表示方式属性值说明使用场景颜色关键字颜色英文单词red,green,blue学习测试rgb表示法rg(r,g,b)r,g,b表示红绿蓝三原色,取值0-255了解rgba表示法rgba(r,g,b,a)a表示透明度,取…...

【【自动驾驶】车辆运动学模型】
【自动驾驶】车辆运动学模型 1. 引言2. 以车辆重心为中心的单车模型2.1 模型介绍2.2 滑移角 β \beta β 的推导2.2 航向角 ψ \psi ψ推导过程:2.3 滑移角 β \beta β2.3 Python代码实现2.4 C代码实现 3. 前轮驱动的单车模型3.1 模型介绍3.3 Python代码实现3.4 …...

叉尖避障新科技:因泰立科技ILS-T52三维深度成像激光雷达
ILS-T52三维深度成像激光雷达是一款高性能的纯固态式激光雷达,采用激光时间飞行法,提供出色的三维图像成像和深度感知功能。特别适用于无人叉车领域,为叉尖避障提供卓越的三维成像和深度感知功能。它的高精度、自适应自动曝光、小尺寸、低功耗…...

精华帖分享 | 低估值还能涨多久?
本文来源于量化小论坛策略分享会板块精华帖,作者为亮子,发布于2024年3月19日。 这两年,A股给我们的感觉就是成长股坍塌,高股息低估值的股票扛起大旗。表现出来就是中国神华、中海油这样的垄断型央国企大涨,包括移动联通…...
如何制作一个自己的网站?
在今天的互联网时代,网站展示已经是一个很基础的营销工具。不管是企业、还是个人,如何制作一个自己的网站?本文将会提供一个全面的基础制作网页教程,教你如何从零开始制作网页。 网页制作的基础知识:HTML、CSS和JavaS…...
torch报错
The Kernel crashed while executing code in the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click here for more info. View Jupyter log for further details. 从日志中可以看出,内…...

深入探索卷积神经网络(CNN):图像分类的利器
深入探索卷积神经网络(CNN):图像分类的利器 前言CNN的崛起:为何我们需要它?图像卷积:CNN的基石轮廓过滤器:捕捉边缘特征 图像池化:降低维度的利器CNN的组成:卷积层、池化…...

网站建设中需要注意哪些安全问题?----雷池社区版
服务器与应用安全指南 1. 服务器安全 1.1 操作系统安全 及时更新补丁:确保操作系统始终安装最新补丁,以防范系统漏洞。例如,Windows Server 定期推送安全更新,修复如远程代码执行等潜在威胁。优化系统服务配置:关闭不…...

光控资本:养老金融建设提速 高速铜缆市场空间广阔
养老金融制作提速 金融监管总局办公厅近来印发的《关于大力展开商业保险年金有关事项的奉告》(下称《奉告》)提出,进一步扩大商业养老金业务试点;开发习惯个人养老金准则的新产品和专属产品;保险公司要坚持长期出资、…...

部署前后端分离若依项目--CentOS7宝塔版
准备: CentOS7服务器一台 通过网盘分享的文件:CentOS 7 h 链接: https://pan.baidu.com/s/17DF8eRSSDuj9VeqselGa_Q 提取码: s7x4 大家有需要可以下载这个,密码61 若依前端编译后文件 通过网盘分享的文件:ruoyi-admin.jar 链…...

ubuntu22.04 R Rstudio conda python 深大
一、配置IP network:version: 2renderer: networkdethernets:eth0:dhcp4: noaddresses:- 172.20.0.52/24gateway4: 172.20.0.2nameservers:addresses: [8.8.8.8, 8.8.4.4] 二、update apt update apt upgrade 三、安装python ubuntu 22.04安装python3 在Ubuntu 22.04上安装…...

二百七十一、Kettle——ClickHouse增量导入数据清洗记录表
一、目的 在完成错误数据表任务后,需要对每条错误数据的错误字段及其字段值进行分析 Hive中原有SQL语句和ClickHouse现有SQL语句很大不同 二、Hive中原有代码 2.1 表结构 --31、静态排队数据清洗记录表 create table if not exists hurys_db.dwd_data_clean_…...

为什么说Tcp是面向字节流的以及(Tcp粘包问题、TCP/UDP对比、listen函数的backlog参数的意义)
为什么说Tcp是面向字节流的: Tcp通信的本质是创建一个tcp的socket,同时就会对应的创建一个发送缓冲区和接收缓冲区。 调用write时, 数据会先写入发送缓冲区中;如果发送的字节数太长, 会被拆分成多个TCP的数据包发出如果发送的字节数太短, 就会先在缓冲…...
Flink PostgreSQL CDC源码解读:深入理解数据流同步
目录 一、PostgreSQL的数据捕获和复制机制 二、WAL日志格式 三、Debezium部署架构 3.1 Kafka Connect With Debezium 3.2 Debezium Server 编辑3.3 作为嵌入式引擎 四、Flink Postgres CDC源码解读 4.1. 如何捕捉数据和更新快照 4.2. 捕获的数据怎么从Postgres SQL…...
系统架构设计师 软件架构的定义与生命周期
软件架构的定义 通过一系列的设计活动,以满足系统的功能性需求和符合一定的非功能性需求与质量属性有相似含义的软件系统框架模式。在软件体系结构设计过程中,主要考虑的是系统的非功能性需求 软件体系结构设计经验的总结与重用是软件工程的重要目标之一…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...