C++:std::deque简介

std::deque 是 C++ 标准模板库(STL)中的一个双端队列(Double-ended Queue)容器。它是一种动态数组,允许快速地在序列的两端插入和删除元素,同时支持随机访问。

特点

  1. 双端操作

    支持在队列头部尾部快速插入和删除元素,复杂度为 O(1)
  2. 随机访问

    提供与 std::vector 类似的随机访问功能,支持 operator[] 和 at() 方法。
  3. 动态扩展

    不像 std::vector 使用连续内存块,std::deque 使用一系列的小内存块组成。它可以高效地动态扩展,而不需要像 std::vector 那样重新分配和拷贝。
  4. 迭代器有效性

    插入或删除不会使其他元素的迭代器失效,除非操作的是两端。
  5. 性能

    在两端插入、删除时性能优于 std::vector,但中间插入或删除性能略逊于 std::vector

常用接口

构造函数

#include <deque>
std::deque<int> d1;               // 默认构造空 deque
std::deque<int> d2(5, 10);        // 创建 5 个值为 10 的元素
std::deque<int> d3{1, 2, 3};      // 使用列表初始化
std::deque<int> d4(d3.begin(), d3.end()); // 从迭代器范围初始化

元素访问

std::deque<int> d = {1, 2, 3, 4};
std::cout << d[0] << std::endl;   // 访问第一个元素 (不检查越界)
std::cout << d.at(1) << std::endl; // 访问第 2 个元素 (检查越界)
std::cout << d.front() << std::endl; // 返回第一个元素
std::cout << d.back() << std::endl;  // 返回最后一个元素

修改操作

std::deque<int> d;
d.push_back(1);           // 尾部插入 1
d.push_front(2);          // 头部插入 2
d.pop_back();             // 移除尾部元素
d.pop_front();            // 移除头部元素d.insert(d.begin() + 1, 3); // 在指定位置插入 3
d.erase(d.begin());        // 移除指定位置的元素
d.clear();                 // 清空所有元素

大小操作

std::deque<int> d = {1, 2, 3};
std::cout << d.size() << std::endl;    // 返回元素个数
std::cout << d.empty() << std::endl;  // 判断是否为空

排序

#include <algorithm>
std::deque<int> d = {4, 1, 3, 2};
std::sort(d.begin(), d.end()); // 对 deque 排序

遍历

for (auto it = d.begin(); it != d.end(); ++it) {std::cout << *it << " ";
}
for (int val : d) {         // 基于范围的循环std::cout << val << " ";
}

应用场景

  1. 双端操作的场景

    适用于需要在头尾频繁插入或删除的场景,例如滑动窗口问题。
  2. 替代 std::queue

    虽然 std::queue 是基于 std::deque 实现的,但如果需要随机访问或对队列内容排序,可以直接使用 std::deque
  3. 缓存系统

    由于支持两端高效操作,std::deque 常用于实现 LRU 缓存等机制。

举例:

#include <deque>
#include <iostream>int main() {std::deque<int> dq = {10, 20, 30};dq.push_front(5);     // 头部插入dq.push_back(40);     // 尾部插入std::cout << "Deque: ";for (int v : dq) {std::cout << v << " ";}std::cout << std::endl;dq.pop_front();       // 移除头部dq.pop_back();        // 移除尾部std::cout << "After pops: ";for (int v : dq) {std::cout << v << " ";}return 0;
}

输出:

Deque: 5 10 20 30 40
After pops: 10 20 30

和 std::vector 的对比

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】基础IO_文件系统IO_“一切皆文件”_缓冲区

目录 1. 理解"⽂件" 1-1 狭义理解 1-2 ⼴义理解 1-3 ⽂件操作的归类认知 1-4 系统⻆度 访问文件&#xff0c;需要先打开文件&#xff01;那么是由谁打开文件&#xff1f;&#xff1f;&#xff1f; 操作系统要不要把被打开的文件管理起来&#xff1f; 2. 回顾…

nginx防盗链原理与实践

nginx防盗链的原理是基于http请求头中的referer来限制对资源的访问&#xff08;referer是用来告知浏览器该网页时从哪个页面链接来的&#xff09;&#xff0c;从而防止其他网站胃经授权直接链接资源。 nginx防盗链的作用是节省带宽和资源消耗&#xff0c;保护数据安全&#xf…

UG NX二次开发(Python)-UIStyler-选取点

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、设计一个UI界面3、创建长方体的代码4、需要引入的库5、测试验证1、前言 采用Python语言进行UG NX二次开发的资料比较少,我本来不是很认可采用Python进行二次开发的,但是近期有读者咨询…

linux环境中后台运行java程序

在生产环境&#xff0c;我们通常需要让java进程后台运行&#xff0c;并且即使会话关闭&#xff0c;进程也依然存在。 使用的命令&#xff1a; nohup java -jar xxx.jar -> aaa.log 2>&1 & 详细介绍下上面这条命令 &#xff08;1&#xff09;nohup&#xff1a;…

算法笔记:力扣15、三数之和

思路&#xff1a; 实现代码 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result new ArrayList<>(); Arrays.sort(nums); // 先对数组进行排序 for (int i 0; i < nums.length - 2; i) { /…

java基础语法光速入门

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理Java的基础语法部分 适合有编程基础的人快点掌握语法使用 没学过一两门语言的话。。还是不建议看了 极致的浓缩没有一点解释 注释 单行注释 // 多行注释 /**/ 数据类型 布尔型:true false 整型:int,lon…

karmada-descheduler

descheduler规则 karmada-descheduler 定期检测所有部署&#xff0c;通常是每2分钟一次&#xff0c;并确定目标调度集群中无法调度的副本数量。它通过调用 karmada-scheduler-estimator 来完成这个过程。如果发现无法调度的副本&#xff0c;它将通过减少 spec.clusters 的配…

LeetCode 力扣 热题 100道(十四)二叉树的中序遍历(C++)

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 如下为代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullpt…

STM32之ADC采集和DMA传输(八)

STM32F407 系列文章 -内部ADC采集和DMA传输&#xff08;八&#xff09; 目录 前言 一、ADC特性 二、DMA特性 三、ADC采集 1.单通道ADC采集 1.头文件定义 2.函数adc_init() 3.函数HAL_ADC_MspInit() 4.函数adc_channel_set() 5.函数adc_get_result() 6.函数adc_get_r…

三菱人机界面GOT SIMPLE 系列 GS2107\GS2110\GS2512

以客户需求为核心的全面升级!GOT SIMPLE系列新功能 GOT SIMPLE升级版重磅更新&#xff0c;增添了许多期待已久的新功能&#xff0c;帮助用户实现远程维护! 扩充用户存储器容量至15MB&#xff0c;并支持轮廓字体&#xff0c;以实现平滑、靓丽的字体显示。此外&#xff0c;可使用…

VLTVG代码复现并讲解

train.py 在main函数中找到这个构建模型的地方&#xff0c;ctrl&#xff0b;左键点进这个函数中去 来到了这里 又来到了这里&#xff0c;这里就是构建模型的地方&#xff1a; 又来到了这里&#xff0c;还是在VLTVG.py这个文件中&#xff1a; Method The Overall Network Visua…

转换思维是为智

转换思维是为智 2023年11月08日(节选) 我们人的思维分为人间思维&#xff0c;圣人思维&#xff0c;菩萨思维。人间思维讲得通俗一点就是世间智慧&#xff0c;他拥有的是人间的智慧&#xff0c;讲得再简单一点&#xff0c;就是人间的聪明。圣人的思维是什么&#xff0c;是一种脱…

qtcanpool 知 10:包管理雏形

文章目录 前言痛点转机雏形实践后语 前言 曾听闻&#xff1a;C/Qt 没有包管理器&#xff0c;开发起来太不方便。这是一个有过 node.js 开发经验的人对 Qt 的吐槽。 确实&#xff0c;像 python、golang、node.js 这些编程语言都有包管理器&#xff0c;给用户带来了极佳的开发体…

光敏传感器实验

用到 ADC 采集&#xff0c;通过 ADC 采集电压&#xff0c;获取光敏传感器的电阻变化&#xff0c;从而得出环境光线的变化&#xff0c;并在 TFTLCD 上面显示出来。 光敏传感器是最常见的传感器之一&#xff0c;它的种类繁多&#xff0c;主要有&#xff1a;光电管、光电倍增管…

Modbus RTU转Profinet接4台流量器配置案例

Modbus RTU转Profinet是工业自动化领域常见的通讯协议。Modbus RTU因其简单、可靠而被广泛应用于各种设备间的数据传输&#xff0c;而Profinet则以其高速、实时性在现代工业4.0场景中扮演着重要角色。本文将详细解析如何将Modbus RTU转换为Profinet&#xff0c;并通过实际案例来…

【AI系统】推理系统架构

推理系统架构 推理系统架构是 AI 领域中的一个关键组成部分&#xff0c;它负责将训练好的模型应用于实际问题&#xff0c;从而实现智能决策和自动化。在构建一个高效的推理系统时&#xff0c;我们不仅需要考虑其性能和准确性&#xff0c;还需要确保系统的可扩展性、灵活性以及…

家事速配社区新经济与消费新业态创新峰会成功举办,开启多元合作新篇章

2024 年 11 月 28 日&#xff0c;家事速配社区新经济与消费新业态创新峰会在福建福州隆重举行&#xff0c;此次峰会汇聚了各界精英嘉宾&#xff0c;共同见证了一系列具有里程碑意义的合作签约仪式&#xff0c;为社区新经济与消费新业态的融合发展注入强大动力。 上午时分&#…

数字逻辑——二进制

目录 1 信息与编码 1.1 什么是信息&#xff1f; 1.2 什么是编码&#xff1f; 2 数制和码制 2.1 数制 3 一些基本概念 3.1 位&#xff08;bit&#xff09; 3.2 字节&#xff08;byte&#xff09; 3.3 数据量的大小表示符号 4 二进制 4.1 二进制简介 4.2 二进制的…

PyQt信号槽实现页面的登录与跳转 #页面进一步优化

将登录框中的取消按钮使用信号和槽的机制&#xff0c;关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为"123456",如果账号密码匹配成功&#xff0c;当前界面关…

博客园-添加统计图

&#x1f496;简介 通过WPS在线列表构建博客园每日相关数据统计图。 &#x1f449;效果 &#x1f4d6;实现 前往WPS https://www.kdocs.cn/latest 新建多维表格 创建表格视图 新建仪表盘 新建卡片、折线图 卡片配置示例 折线图配置示例 点击分享获取链接 ⭐链接配置 在co…