当前位置: 首页 > news >正文

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. 优缺点

优点

  • 高效支持头部和尾部的插入与删除。
    在这里插入图片描述

  • 随机访问性能良好,适合频繁需要访问数据的场景。

    小数组长度固定,计算位置时,先减去头或尾数组的数据个数,然后一除就能得到位置。

  • 适合用作 stackqueue 的默认容器。C++ -stack、queue

    适合用于需要频繁在两端插入和删除数据的场景

缺点

  • 在中间位置插入或删除操作的效率较低,因为 deque 不支持单独小数组的大小调整。
  • 随机访问时的计算不如 vector 高效。

    但如果数据量较小其实还好。

下面这段代码,对vectordeque进行排序,用于比较vectordeque在随机访问的效率上的区别:

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 特别适合用于需要频繁在两端插入和删除数据的场景,因此,它是实现栈和队列的一个理想容器,提供了在高频数据操作时的良好性能。
这就是为什么,库中stackqueue的默认容器是deque
在这里插入图片描述

在这里插入图片描述

6. 结论

双端队列是一种强大且灵活的数据结构,能够在多种情况下满足开发者的需求。尽管它在特定情况下可能不如列表和向量广泛使用,但了解其特性和应用场景,可以帮助开发者在设计高效算法时做出更明智的选择。
在这里插入图片描述


希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

相关文章:

C++ - deque

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

国产!瑞芯微米尔RK357核心板革新AIoT设备,8核6T高算力

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

中国人寿财险青岛市分公司践行绿色金融,助力可持续发展

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

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流程组件介绍--开始监听网络请求

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

CSS综合案例——新闻详情

一、知识点 1、文字颜色 属性名&#xff1a;color 属性值&#xff1a; 颜色表示方式属性值说明使用场景颜色关键字颜色英文单词red,green,blue学习测试rgb表示法rg(r,g,b)r,g,b表示红绿蓝三原色&#xff0c;取值0-255了解rgba表示法rgba(r,g,b,a)a表示透明度&#xff0c;取…...

【【自动驾驶】车辆运动学模型】

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

叉尖避障新科技:因泰立科技ILS-T52三维深度成像激光雷达

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

精华帖分享 | 低估值还能涨多久?

本文来源于量化小论坛策略分享会板块精华帖&#xff0c;作者为亮子&#xff0c;发布于2024年3月19日。 这两年&#xff0c;A股给我们的感觉就是成长股坍塌&#xff0c;高股息低估值的股票扛起大旗。表现出来就是中国神华、中海油这样的垄断型央国企大涨&#xff0c;包括移动联通…...

如何制作一个自己的网站?

在今天的互联网时代&#xff0c;网站展示已经是一个很基础的营销工具。不管是企业、还是个人&#xff0c;如何制作一个自己的网站&#xff1f;本文将会提供一个全面的基础制作网页教程&#xff0c;教你如何从零开始制作网页。 网页制作的基础知识&#xff1a;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. 从日志中可以看出&#xff0c;内…...

深入探索卷积神经网络(CNN):图像分类的利器

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

网站建设中需要注意哪些安全问题?----雷池社区版

服务器与应用安全指南 1. 服务器安全 1.1 操作系统安全 及时更新补丁&#xff1a;确保操作系统始终安装最新补丁&#xff0c;以防范系统漏洞。例如&#xff0c;Windows Server 定期推送安全更新&#xff0c;修复如远程代码执行等潜在威胁。优化系统服务配置&#xff1a;关闭不…...

光控资本:养老金融建设提速 高速铜缆市场空间广阔

养老金融制作提速 金融监管总局办公厅近来印发的《关于大力展开商业保险年金有关事项的奉告》&#xff08;下称《奉告》&#xff09;提出&#xff0c;进一步扩大商业养老金业务试点&#xff1b;开发习惯个人养老金准则的新产品和专属产品&#xff1b;保险公司要坚持长期出资、…...

部署前后端分离若依项目--CentOS7宝塔版

准备&#xff1a; CentOS7服务器一台 通过网盘分享的文件&#xff1a;CentOS 7 h 链接: https://pan.baidu.com/s/17DF8eRSSDuj9VeqselGa_Q 提取码: s7x4 大家有需要可以下载这个&#xff0c;密码61 若依前端编译后文件 通过网盘分享的文件&#xff1a;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增量导入数据清洗记录表

一、目的 在完成错误数据表任务后&#xff0c;需要对每条错误数据的错误字段及其字段值进行分析 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是面向字节流的&#xff1a; Tcp通信的本质是创建一个tcp的socket&#xff0c;同时就会对应的创建一个发送缓冲区和接收缓冲区。 调用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…...

系统架构设计师 软件架构的定义与生命周期

软件架构的定义 通过一系列的设计活动&#xff0c;以满足系统的功能性需求和符合一定的非功能性需求与质量属性有相似含义的软件系统框架模式。在软件体系结构设计过程中&#xff0c;主要考虑的是系统的非功能性需求 软件体系结构设计经验的总结与重用是软件工程的重要目标之一…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...