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

「C/C++」C++ STL容器库 之 std::deque 双端队列容器

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

      • std::deque 容器详解
        • 1. 引用头文件
        • 2. 函数构造与对象初始化
        • 3. 对象初始化与元素访问
        • 4. 迭代器
        • 5. 容器操作
        • 6. 修改器
        • 7. 元素比较
      • 总结
        • 应用场景

std::deque 容器详解

std::deque(双端队列)是C++标准模板库(STL)中的一种序列容器,它提供了动态数组的功能,但与std::vector不同的是,std::deque允许在容器的两端高效地插入和删除元素。本文将详细介绍std::deque的使用,包括引用头文件、函数构造、对象初始化、元素访问、迭代器、容器操作、修改器以及元素比较等方面。
在这里插入图片描述
上图截图为黑马C++课程

1. 引用头文件

要使用std::deque,首先需要包含相应的头文件:

#include <deque>
2. 函数构造与对象初始化

std::deque提供了多种构造函数来创建和初始化容器对象。

#include <iostream>
#include <deque>int main() {// 1. 默认构造函数,创建一个空的双端队列std::deque<int> dq1;// 2. 填充构造函数,创建一个包含5个元素的双端队列,所有元素初始化为0std::deque<int> dq2(5, 0);// 3. 列表初始化构造函数,创建一个包含指定元素的双端队列std::deque<int> dq3 = {1, 2, 3, 4, 5};// 输出dq3的内容for (int n : dq3) {std::cout << n << " ";}std::cout << std::endl;return 0;
}
3. 对象初始化与元素访问

在这里插入图片描述

在创建std::deque对象后,可以通过多种方式访问其元素。

#include <iostream>
#include <deque>int main() {std::deque<int> dq = {10, 20, 30, 40, 50};// 1. 使用下标操作符访问元素std::cout << "Element at index 2: " << dq[2] << std::endl; // 输出30// 2. 使用at函数访问元素(带边界检查)try {std::cout << "Element at index 4: " << dq.at(4) << std::endl; // 输出50} catch (const std::out_of_range& e) {std::cerr << "Out of range error: " << e.what() << std::endl;}// 3. 使用front和back函数访问第一个和最后一个元素std::cout << "First element: " << dq.front() << std::endl; // 输出10std::cout << "Last element: " << dq.back() << std::endl;   // 输出50return 0;
}
4. 迭代器

在这里插入图片描述

std::deque支持双向迭代器,允许在容器中向前和向后遍历元素。

#include <iostream>
#include <deque>int main() {std::deque<int> dq = {1, 2, 3, 4, 5};// 1. 使用正向迭代器遍历双端队列for (std::deque<int>::iterator it = dq.begin(); it != dq.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 2. 使用反向迭代器遍历双端队列for (std::deque<int>::reverse_iterator rit = dq.rbegin(); rit != dq.rend(); ++rit) {std::cout << *rit << " ";}std::cout << std::endl;return 0;
}
5. 容器操作

在这里插入图片描述

std::deque提供了多种容器操作函数,如sizeemptyresizemax_sizeswap

#include <iostream>
#include <deque>int main() {std::deque<int> dq = {1, 2, 3};// 1. 获取容器大小std::cout << "Size of deque: " << dq.size() << std::endl; // 输出3// 2. 检查容器是否为空std::cout << "Is deque empty? " << (dq.empty() ? "Yes" : "No") << std::endl; // 输出No// 3. 调整容器大小(如果新大小大于当前大小,则新元素初始化为0)dq.resize(5);std::cout << "Size after resize: " << dq.size() << std::endl; // 输出5// 4. 获取容器能容纳的最大元素数量std::cout << "Max size of deque: " << dq.max_size() << std::endl;// 5. 交换两个容器的内容std::deque<int> dq2 = {10, 20, 30};dq.swap(dq2);std::cout << "dq after swap: ";for (int n : dq) {std::cout << n << " ";}std::cout << std::endl; // 输出10 20 30return 0;
}
6. 修改器

在这里插入图片描述

std::deque提供了多种修改器函数来插入、删除和替换元素。

#include <iostream>
#include <deque>int main() {std::deque<int> dq = {1, 2, 3, 4, 5};// 1. 在末尾插入元素dq.push_back(6);// 2. 在开头插入元素dq.push_front(0);// 输出dq的内容std::cout << "Deque after push_back and push_front: ";for (int n : dq) {std::cout << n << " ";}std::cout << std::endl; // 输出0 1 2 3 4 5 6// 3. 从末尾删除元素dq.pop_back();// 4. 从开头删除元素dq.pop_front();// 输出dq的内容std::cout << "Deque after pop_back and pop_front: ";for (int n : dq) {std::cout << n << " ";}std::cout << std::endl; // 输出1 2 3 4 5// 5. 在指定位置插入元素dq.insert(dq.begin() + 2, 99);// 输出dq的内容std::cout << "Deque after insert: ";for (int n : dq) {std::cout << n << " ";}std::cout << std::endl; // 输出1 2 99 3 4 5// 6. 删除指定位置的元素dq.erase(dq.begin() + 2);// 输出dq的内容std::cout << "Deque after erase: ";for (int n : dq) {std::cout << n << " ";}std::cout << std::endl; // 输出1 2 3 4 5return 0;
}
7. 元素比较

在这里插入图片描述

虽然std::deque本身不直接提供元素比较的成员函数,但可以使用标准库中的算法函数(如std::equal)来比较两个std::deque对象的内容。

#include <iostream>
#include <deque>
#include <algorithm> // for std::equalint main() {std::deque<int> dq1 = {1, 2, 3, 4, 5};std::deque<int> dq2 = {1, 2, 3, 4, 5};std::deque<int> dq3 = {1, 2, 3, 6, 5};// 比较两个双端队列是否相等(按元素顺序和值)bool areEqual1 = std::equal(dq1.begin(), dq1.end(), dq2.begin());bool areEqual2 = std::equal(dq1.begin(), dq1.end(), dq3.begin());std::cout << "dq1 and dq2 are equal? " << (areEqual1 ? "Yes" : "No") << std::endl; // 输出Yesstd::cout << "dq1 and dq3 are equal? " << (areEqual2 ? "Yes" : "No") << std::endl; // 输出Noreturn 0;
}

总结

std::deque(双端队列)是C++标准模板库(STL)中一个非常灵活且功能强大的序列容器。它结合了std::vector的动态数组特性和std::list的双向链表特性,允许在容器的两端高效地插入和删除元素,同时提供了随机访问功能。

应用场景
  1. 动态数组扩展

    • 当需要一个可以动态调整大小的数组,并且需要在数组的两端频繁插入或删除元素时,std::deque是一个很好的选择。与std::vector相比,std::deque在两端插入和删除元素时的性能更优,因为它不需要像std::vector那样在内存中进行大量的数据搬移。
  2. 队列和栈的实现

    • std::deque可以很方便地用作队列(FIFO,先进先出)和栈(LIFO,后进先出)的实现。对于队列,可以使用push_back在尾部插入元素,使用pop_front在头部删除元素;对于栈,则可以使用push_front在头部插入元素,使用pop_front在头部删除元素。
  3. 滑动窗口算法

    • 在处理滑动窗口问题时,std::deque可以高效地存储当前窗口内的元素,并允许在窗口的两端进行快速的插入和删除操作。这对于解决一些数组或字符串处理中的滑动窗口问题特别有用。
  4. 缓存和缓冲区

    • std::deque可以用作缓存或缓冲区,存储临时数据。由于它允许在两端进行高效的插入和删除操作,因此非常适合用于需要频繁更新数据结构的场景。
  5. 数据流的处理

    • 在处理数据流时,std::deque可以存储最近接收到的数据,并根据需要丢弃旧数据或添加新数据。这对于实时数据处理和流处理应用特别有用。
  6. 算法和数据结构中的辅助容器

    • 在实现一些复杂的算法和数据结构时,std::deque可以作为辅助容器来存储中间结果或临时数据。它的高效性和灵活性使其成为许多算法和数据结构实现中的理想选择。

综上所述,std::deque是一个功能强大且灵活的容器,适用于多种应用场景。它的高效性和易用性使其成为C++程序员在处理动态数据结构时的有力工具。

在这里插入图片描述

相关文章:

「C/C++」C++ STL容器库 之 std::deque 双端队列容器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

一招教你解决Facebook广告账号问题

这段时间&#xff0c;我们写了很多文章来探讨Facebook的广告账户问题&#xff1a;《Facebook被封号该怎么办》《Facebook二不限、三不限账号是什么》《Facebook海外户&#xff08;三不限&#xff09;和账单户该如何选择》《如何区分真假Facebook三不限海外户》相信看过这些文章…...

MySQL启动报错:InnoDB: Unable to lock ./ibdata1 error

MySQL启动报错&#xff1a;InnoDB: Unable to lock ./ibdata1 error 在OS X环境下MySQL启动时报错&#xff1a; 016-03-03T00:02:30.483037Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35 2016-03-03T00:02:30.483100Z 0 [Note] InnoDB: Check that you do not alr…...

Linux终端之旅: 打包和压缩

在 Linux 世界中&#xff0c;打包和压缩文件是管理系统资源、传输数据和备份的重要技能。通过命令行工具如 tar、gzip、zip 等&#xff0c;我们可以高效地将多个文件或目录打包为一个文件&#xff0c;并通过压缩减少其体积。接下来&#xff0c;我将记录学习如何利用这些工具&am…...

PDA手持机提升管理效率和准确性

在当今快节奏的商业世界中&#xff0c;管理效率和准确性是企业成功的关键因素。而 PDA 手持机的出现&#xff0c;为企业管理带来了革命性的变革&#xff0c;成为提升管理效率和准确性的有力武器。 PDA 手持机&#xff0c;即个人数字助理手持设备&#xff0c;集数据采集、存储、…...

C++ [项目] 愤怒的小鸟

现在才发现C游戏的支持率这么高&#xff0c;那就发几篇吧 零、前情提要 此篇为 制作,由于他没有CSDN,于是由我代发 一、基本介绍 支持Dev-C5.11版本(务必调为英文输入法),基本操作看游戏里的介绍,怎么做的……懒得说,能看懂就看注释,没有的自己猜,如果你很固执……私我吧 …...

群控系统服务端开发模式-市场分析

刚刚我把群控系统服务端开发模式的文档全部整理了一下&#xff0c;结果发现还缺市场分析这篇文档没有上传&#xff0c;不好意思啦。 一、前言 在互联网高速发展且稳定的时代&#xff0c;营销系统是自运营公司线上最好的系统。加上现在直播行业很火&#xff0c;引流很重要&#…...

智能听诊器革新宠物健康监测

在宠物健康护理领域&#xff0c;智能听诊器的引入标志着一个新时代的开启&#xff0c;它正成为宠物医疗保健的新宠。这款设备通过高精度传感器捕捉宠物的心跳和呼吸声&#xff0c;为宠物主人和兽医提供精确的健康数据。 智能听诊器的即时反馈功能&#xff0c;使得主人能够通过…...

2000-2023年上市公司绿色专利申请授权面板数据

2000-2023年上市公司绿色专利申请授权面板数据 1、时间&#xff1a;2000-2023年 2、来源&#xff1a;国家知识产权局、WPIO清单 3、指标&#xff1a;年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、区县代码、上市状态、绿色专利申请总量、绿色发明专利申…...

vue使用xlsx以及file-saver进行下载xlsx文件以及Unit8Array、ArrayBuffer、charCodeAt的使用

先说Unit8Array、ArrayBuffer、charCodeAt的使用下面会用到这三个 Unit8Array&#xff1a;数组类型表示一个 8 位无符号整型数组&#xff0c;创建时内容被初始化为 0。创建完后&#xff0c;可以以对象的方式或使用数组下标索引的方式引用数组中的元素。 new Uint8Array(); //…...

日语表目的的两个句型,柯桥成人零基础日语培训

句型&#xff1a; &#xff08;能做动词的&#xff09;名词&#xff08;或动词连用形&#xff09;に来ました&#xff08;或行きます&#xff09; 例句&#xff1a; わたしは日本へ文学の勉強に来ました。/我是到日本来学习文学的。 翻译&#xff1a; &#xff08;我&#…...

小程序中设置可拖动区域

官方说明文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/movable-area.htmlhttps://developers.weixin.qq.com/miniprogram/dev/component/movable-view.html demo&#xff1a;浮动控件上下移动交互 .wxmx <movable-area><!-- y"…...

前端后台管理开发

1通常项目从头开发&#xff0c;有人是二开&#xff0c;有人是从头&#xff0c;也有人是复制之前人留的。 2通常要自己写就很费时间&#xff0c;多数都是接别人的二手代码继续干&#xff0c;导致很多人没有从头开发的经验&#xff0c;做两三年。 3项目开始一般要选择搭建环境&am…...

GDAL+C#实现矢量多边形转栅格

1. 开发环境测试 参考C#配置GDAL环境&#xff0c;确保GDAL能使用&#xff0c;步骤简述如下&#xff1a; 创建.NET Framework 4.7.2的控制台应用 注意&#xff1a; 项目路径中不要有中文&#xff0c;否则可能报错&#xff1a;can not find proj.db 在NuGet中安装GDAL 3.9.1和G…...

Python 爬虫实战之爬拼多多商品做数据分析

一、项目背景 在电商领域&#xff0c;拼多多作为一家具有广泛影响力的平台&#xff0c;拥有大量的商品信息和用户数据。通过爬取拼多多商品数据并进行分析&#xff0c;可以了解市场趋势、消费者需求以及竞争对手情况&#xff0c;为企业决策和产品优化提供有力支持。 二、技术准…...

爬虫基础

maven pom <dependencies><!--前端jqury--><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.16.1</version></dependency><!--http工具--><dependency><grou…...

HTML3D旋转相册

文章目录 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐...

[linux]快速入门

学习目标 通过学习能够掌握以下的linux操作 操作系统 按照应用领域的不同, 操作系统可以分为几类 桌面操作系统服务器操作系统移动设备操作系统嵌入式操作系统 不同领域的主流操作系统 桌面操作系统 Windows(用户数量最多)MacOS(操作体验好&#xff0c;办公人士首选)Linux…...

域3:安全工程 第6章 密码学与对称密钥算法

---域3主要包括OSG 6、7、8、9、10 章--- 随着信息化时代的推进&#xff0c;网络安全愈发关键。CISSP认证考试中的第6章&#xff0c;专注于密码学与对称密钥算法&#xff0c;这两者是网络安全的核心。 密码学&#xff0c;历经演变&#xff0c;从古代简单的替代密码到现代的复杂…...

MySQL注入load_file常用路径

在MySQL注入攻击中&#xff0c;攻击者可能会尝试利用LOAD_FILE()函数来读取服务器上的敏感文件。LOAD_FILE()函数允许从服务器的文件系统中读取文件&#xff0c;并将其内容作为字符串返回。然而&#xff0c;这个函数需要满足一定的权限条件&#xff0c;并且文件路径必须是服务器…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...