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

【C++】深入理解 C++ 优先级队列、容器适配器与 deque:实现与应用解析

个人主页: 起名字真南的CSDN博客

个人专栏:

  • 【数据结构初阶】 📘 基础数据结构
  • 【C语言】 💻 C语言编程技巧
  • 【C++】 🚀 进阶C++
  • 【OJ题解】 📝 题解精讲

目录

  • 前言
  • 📌 1. 优先级队列、容器适配器和 `deque` 概述
    • ✨1.1 什么是优先级队列?
    • ✨ 1.2 容器适配器与 `deque`
  • 📌 2. `deque` 的特点与基本操作
    • ✨2.1 特点
    • ✨2.2 基本操作
  • 📌 3. 容器适配器的类型与实现原理
  • 📌 4. `priority_queue` 的基本使用
  • 📌 5. 实际应用场景:任务调度与路径搜索
    • ✨5.1 优先级队列在任务调度中的应用
    • ✨ 5.2 `deque` 在滑动窗口问题中的应用
  • 📌 6. 总结与常见问题解答
    • ✨ 6.1 常见问题
  • 总结

前言

在 C++ 标准库中,优先级队列(priority_queue)是一种容器适配器,特别适合处理需要频繁访问最大值或最小值的数据集。同时,双端队列 deque 也是一种灵活的标准容器,支持高效的头尾插入、删除操作,被广泛用于实现队列、栈等数据结构。本文将深入讲解优先级队列、deque 及其在容器适配器中的应用。


📌 1. 优先级队列、容器适配器和 deque 概述

✨1.1 什么是优先级队列?

优先级队列是一种基于优先级的特殊队列。默认情况下,C++ 的 priority_queue 是最大堆,出队时总是返回最大元素。实现优先级队列的底层容器通常是 vectordeque,其中 deque 是标准库提供的双端队列容器,支持高效的头尾插入和删除。

✨ 1.2 容器适配器与 deque

C++ 容器适配器包括 stackqueuepriority_queue,它们对底层容器进行封装,提供栈、队列等结构的特定接口。dequequeuestack 默认使用的底层容器,提供两端的灵活操作。


📌 2. deque 的特点与基本操作

在这里插入图片描述

deque(双端队列)是 C++ 中的一种序列容器,支持在两端快速插入和删除。deque 的实现类似一个分段的动态数组,因此具备更灵活的内存管理方式,可以在前后两端动态扩展。

✨2.1 特点

  • 双端插入与删除:支持在头尾两端快速插入和删除,效率接近 O(1)
  • 动态扩展:不像 vector 只能从尾部扩展,deque 可以在头部或尾部自由扩展。
  • 支持随机访问:与 vector 类似,可以通过索引访问任意位置的元素,但相比 vector 速度稍慢。

✨2.2 基本操作

#include <iostream>
#include <deque>void deque_example() {std::deque<int> dq;// 在尾部插入dq.push_back(10);dq.push_back(20);// 在头部插入dq.push_front(5);// 访问元素std::cout << "Front: " << dq.front() << std::endl;  // 5std::cout << "Back: " << dq.back() << std::endl;    // 20// 删除头尾元素dq.pop_front();dq.pop_back();// 遍历std::cout << "Elements: ";for (int elem : dq) {std::cout << elem << " ";}std::cout << std::endl;
}int main() {deque_example();return 0;
}

输出

Front: 5
Back: 20
Elements: 10 

代码解析

  • push_backpush_front:分别在尾部和头部插入元素。
  • pop_backpop_front:分别从尾部和头部删除元素。
  • frontback:访问头部和尾部的元素。

📌 3. 容器适配器的类型与实现原理

C++ 容器适配器使用底层容器来构建特定的数据结构,例如栈、队列和优先级队列。以下是容器适配器的类型及默认底层容器:

  • stack:默认使用 deque 实现的后进先出(LIFO)数据结构,也支持 vector
  • queue:使用 deque 实现的先进先出(FIFO)数据结构,提供 pushpopfrontback 操作。
  • priority_queue:通常使用 vectordeque 实现,提供最高优先级元素的访问和出队操作。

使用 deque 作为底层容器时,可以灵活利用其双端插入和删除的特性。


📌 4. priority_queue 的基本使用

在这里插入图片描述

priority_queue 默认是最大堆,每次 pop 操作返回当前的最大值。其底层容器通常使用 vector,但 deque 也可以用作其底层容器。
如果我们想让他最小堆可以在传入参数的时候传入 greater

#include <iostream>
#include <queue>
#include <vector>
#include <functional>  // std::greaterint main()
{std::priority_queue<int> pq_max;pq_max.push(10);pq_max.push(20);pq_max.push(30);pq_max.push(40);while (!pq_max.empty()){cout << pq_max.top() << " ";pq_max.pop();}cout << endl;std::priority_queue<int,vector<int>,greater<int>> pq_min;pq_min.push(10);pq_min.push(20);pq_min.push(30);pq_min.push(40);while (!pq_min.empty()){cout << pq_min.top() << " ";pq_min.pop();}cout << endl;return 0;
}

输出

40 30 20 10
10 20 30 40

📌 5. 实际应用场景:任务调度与路径搜索

✨5.1 优先级队列在任务调度中的应用

在任务调度中,priority_queue 可以用来根据任务优先级调度任务。例如,操作系统内核中的进程管理通常需要根据优先级选择任务执行。可以使用 priority_queue 来存储任务,每次从队列中取出最高优先级的任务执行。

✨ 5.2 deque 在滑动窗口问题中的应用

deque 因其双端特性,被广泛用于解决滑动窗口问题。例如,在一个数组中找到滑动窗口的最大值,可以通过 deque 快速实现。每当窗口向前滑动时,使用 dequepush_backpop_front 可以高效地更新窗口中的最大值。


📌 6. 总结与常见问题解答

通过本文的介绍,我们全面了解了 priority_queuedeque 的实现与应用场景。以下是一些常见问题解答:

✨ 6.1 常见问题

  1. dequevector 的区别是什么?

    • deque 支持在两端高效插入和删除,而 vector 仅支持尾部的快速插入与删除。
  2. 为什么 priority_queue 默认使用 vector

    • priority_queue 主要关注堆操作的效率,而 vector 是一个连续内存容器,适合在堆排序中实现高效的随机访问。
  3. deque 可以用在 priority_queue 中吗?

    • 可以,priority_queue 支持以 deque 为底层容器,但因为 priority_queue 中通常不需要双端操作,因此更常使用 vector

总结

本文介绍了 C++ 中的 priority_queuedeque 容器,分别适合实现优先级调度和双端队列操作。priority_queuedeque 在实际应用中扮演着重要角色,为各种算法和数据处理提供了高效、简洁的解决方案。希望本篇内容能帮助您更好地理解 C++ 容器的灵活性,并在项目中合理使用这些数据结构。
参考链接:C/C++ Reference

相关文章:

【C++】深入理解 C++ 优先级队列、容器适配器与 deque:实现与应用解析

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 前言&#x1f4cc; 1. 优先级队列、容器适配器和 deque 概述✨1.1 什么是优…...

Android 开发与救砖工具介绍

Android 开发与救砖工具介绍 在 Android 开发和设备维护中&#xff0c;fastboot、adb 和 9008 模式是三个非常重要的工具和模式。它们各自有不同的用途和操作方式&#xff0c;对于开发者和技术支持人员来说&#xff0c;了解它们的功能和使用方法是必不可少的。 1. Fastboot …...

vue2和vue3:diff算法的区别?

Vue 2 和 Vue 3 在 diff 算法方面的主要区别是&#xff1a; Vue 2 使用普通的 diff 算法&#xff0c;它会遍历所有的节点进行比对。 Vue 3 引入了 patch flag 的概念&#xff0c;并且对 diff 算法进行了优化&#xff0c;比如在相同层级的节点间不会去递归比对已经被移除的节点…...

后端返回大数问题

这个问题并不难,但是在开发的时候没有注意到 后端返回了一个列表数据,包含id,这个id是一个大数,列表进入详情,需要将id传入到详情页面详情页面内部通过id获取数据一直404,id不正确找问题,从路由传参到请求数据发现id没有问题,然后和后端进行联调,发现后端返回的id和我获取的id…...

vue3: ref, reactive, readonly, shallowReactive

vue3: ref, reactive, readonly, shallowReactive 原文地址:https://mp.weixin.qq.com/s/S3jPZKEMBP8nQQObF5d2VA <template><!-- <ul><li v-for"item in list.arr">{{item}}</li></ul><button click.prevent"add"…...

5G与4G互通的桥梁:N26接口

5G的商用部署进程将是一个基于4G系统进行的长期的替换、升级、迭代的过程&#xff0c;4G系统是在过渡到5G全覆盖过程中&#xff0c;作为保障用户业务连续性体验这一目的的最好补充。 因此4G/5G融合组网&#xff0c;以及互操作技术将是各大运营商在网络演进中需要重点考虑的问题…...

29-Elasticsearch 集群监控

Elasticsearch Stats 相关的 API ● Elasticsearch 提供了多个监控相关的 API ○ Node Stats&#xff1a; _nodes/stats ○ Cluster Stats: _cluster/stats ○ Index Stats: index_name/_stats Elasticsearch Task API ● 查看 Task 相关的 API ○ Pending Cluster Tasks…...

利用Excel批量生成含二维码的设备管理标签卡片

在日常办公中&#xff0c;批量制作标签是常见且繁琐的任务&#xff0c;尤其当这些标签需要包含大量数据并附带二维码以便快速扫描识别时&#xff0c;难度更是成倍增加。尽管传统的Word邮件合并功能在数据插入方面表现出色&#xff0c;但在二维码生成上却显得有些捉襟见肘。 为…...

小米运动健康与华为运动健康在苹手机ios系统中无法识别蓝牙状态 (如何在ios系统中开启 蓝牙 相册 定位 通知 相机等功能权限,保你有用)

小米运动健康与华为运动健康在苹手机ios系统中无法识别蓝牙状态 &#xff08;解决方案在最下面&#xff0c;参考蓝牙权限设置方式举一反三开启其它模块的权限&#xff09; 最近买了一台小米手表s4&#xff0c;但是苹手机ios系统中的 “小米运动健康” app 始终无法识别我手机…...

高亮变色显示文本中的关键字

效果 第一步&#xff1a;按如下所示代码创建一个用来高亮显示文本的工具类&#xff1a; public class KeywordUtil {/*** 单个关键字高亮变色* param color 变化的色值* param text 文字* param keyword 文字中的关键字* return*/public static SpannableString highLigh…...

Javascript垃圾回收机制-运行机制(大厂内部培训版本)

前言 计算机基本组成&#xff1a; 我们编写的软件首先读取到内存&#xff0c;用于提供给 CPU 进行运算处理。 内存的读取和释放&#xff0c;决定了程序性能。 冯诺依曼结构 解释和编译 这两个概念怎么理解呢。 编译相当于事先已经完成了可以直接用。好比去饭店吃饭点完上…...

【jvm】一个空Object对象的占多大空间

目录 1. 说明2. 结论 1. 说明 1.在Java中&#xff0c;一个空Object对象所占用的内存空间大小会受到JVM&#xff08;Java虚拟机&#xff09;实现和配置的影响&#xff0c;具体数值可能因不同JVM版本和配置而有所不同。2.但一般来说&#xff0c;可以基于一些通用的原则来估算这个…...

241114.学习日志——[CSDIY] [CS]数据结构与算法 [00]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…...

The Planets: Earth -- 练习

环境搭建 该靶场环境来自Vulnhub -------- Difficulty: Easy 靶机与Kali的IP地址只需要在同一局域网即可&#xff08;同一个网段,即两虚拟机处于同一网络模式&#xff09;&#xff0c;所以需要调整KALI和靶场的网络模式&#xff0c;为了方便测试本地采用NAT模式。 注意&…...

linux逻辑卷练习

目录 知识点&#xff1a; 常用命令 题目&#xff1a; 解题&#xff1a; 1&#xff09;分区 2&#xff09;创建物理卷 3&#xff09;创建卷组 4&#xff09;生成逻辑卷 "要带参数 -n" 5&#xff09;扩容 6&#xff09;格式化(添加文件系统) 7&#xff09;挂…...

openai 论文Scaling Laws for Neural Language Models学习

2001.08361 (arxiv.org) 论文研究语言模型在交叉熵损失下的性能经验缩放定律&#xff1a;模型损失&#xff08;性能&#xff09;随模型大小、数据集大小和用于训练的计算量呈现缩放为幂律的关系&#xff0c;有些趋势跨越超过 7 个数量级。其他模型架构细节 &#xff08;如网络…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined

VUE_PROD_HYDRATION_MISMATCH_DETAILS 未明确定义。您正在运行 Vue 的 esm-bundler 构建&#xff0c;它期望这些编译时功能标志通过捆绑器配置全局注入&#xff0c;以便在生产捆绑包中获得更好的tree-shaking优化。 Vue.js应用程序正在使用ESM&#xff08;ECMAScript模块&#…...

基于PHP技术的校园站的设计与实现

毕业论文&#xff08;基于PHP技术的校园站的设计与实现&#xff09; 基于PHP技术的校园网站的设计与实现校园网作为教育、教学、科研、管理等工作的平台和基础设施&#xff0c;它的建立有助于加强师生之间的交流&#xff0c;改变传统的教学模式和教育管理方式&#xff0c;对促…...

JVM回收机制与算法

jvm基本结构 JVM&#xff08;Java虚拟机&#xff09;是Java程序可以跨平台运行的关键。它负责将Java字节码转换为特定平台的机器码&#xff0c;使Java程序能够在不同的硬件和操作系统上运行而无需重新编译。JVM的基本结构主要包括以下几个核心部分&#xff1a; ‌类加载器&…...

24/11/14 算法笔记 GMM高斯混合模型

高斯混合模型&#xff08;Gaussian Mixture Model&#xff0c;简称 GMM&#xff09;是一种概率模型&#xff0c;用于表示具有多个子群体的数据集&#xff0c;其中每个子群体的数据分布可以用高斯分布&#xff08;正态分布&#xff09;来描述。GMM 是一种软聚类方法&#xff0c;…...

ReplaceItems:批量设计元素智能替换引擎 — 献给追求极致效率的UI设计师

ReplaceItems&#xff1a;批量设计元素智能替换引擎 — 献给追求极致效率的UI设计师 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 设计效率瓶颈诊断&#xff1a;为何手动替换如此…...

指挥OpenClaw抓取数据折腾了一夜,我终于想到了邪修玩法

这段时间玩小龙虾玩得真上头&#xff0c;突然想起之前一直想要统计公众号的数据。 这工作交给小龙虾妥妥能胜任啊&#xff01;但是吧……实际上执行出来的结果却不是这样的。 因为小白本地使用的是OpenClawAtomgit的方案&#xff0c;Atomgit主打一个不费一分钱&#xff0c;免…...

如何用GPU加速的MediaPipe TouchDesigner插件实现实时视觉交互

如何用GPU加速的MediaPipe TouchDesigner插件实现实时视觉交互 【免费下载链接】mediapipe-touchdesigner GPU Accelerated MediaPipe Plugin for TouchDesigner 项目地址: https://gitcode.com/gh_mirrors/me/mediapipe-touchdesigner MediaPipe TouchDesigner插件是一…...

Phi-4-mini-reasoning Chainlit协作功能:多人审阅、批注与推理结果共享

Phi-4-mini-reasoning Chainlit协作功能&#xff1a;多人审阅、批注与推理结果共享 1. 模型概述 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员&#xff0c;它经过专门微调以提升数…...

Qwen2.5-Coder-1.5B应用案例:自动生成Bash脚本处理日志文件

Qwen2.5-Coder-1.5B应用案例&#xff1a;自动生成Bash脚本处理日志文件 1. 日志处理场景与痛点分析 1.1 运维工程师的日常挑战 在服务器运维工作中&#xff0c;日志分析是最常见也最耗时的任务之一。想象一下这样的场景&#xff1a; 你需要检查10台服务器上50个不同的服务日…...

高效低成本馈电保护电路设计与应用

1. 为什么需要馈电保护电路&#xff1f; 有源天线在通信系统中扮演着重要角色&#xff0c;但实际使用中经常会遇到一些棘手的问题。比如在野外作业时&#xff0c;技术人员可能会频繁插拔天线&#xff1b;或者在长期运行过程中&#xff0c;天线内部电路可能出现故障。这些情况都…...

华为OD面试官最爱问的10个Python八股文,我这样答拿到了Offer

华为OD Python面试实战指南&#xff1a;10个高频问题的深度解析与应答策略 面试开场&#xff1a;如何用技术叙事打动面试官 去年冬天&#xff0c;我坐在华为OD的会议室里&#xff0c;手指不自觉地敲击着桌面。面试官推了推眼镜&#xff0c;抛出了第一个Python问题。那一刻我突然…...

BilibiliDown:B站视频下载的完整解决方案

BilibiliDown&#xff1a;B站视频下载的完整解决方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliDo…...

VS Code高效调试:自定义console.log快捷键与智能代码片段配置

1. 为什么需要自定义console.log快捷键&#xff1f; 每次调试JavaScript代码时&#xff0c;手动输入完整的console.log语句实在是一件让人抓狂的事情。想象一下这样的场景&#xff1a;你正在调试一个复杂的Vue组件&#xff0c;需要快速查看某个变量的值。按照传统方式&#xf…...

NoSleep防休眠工具:系统唤醒与持续运行的高效解决方案

NoSleep防休眠工具&#xff1a;系统唤醒与持续运行的高效解决方案 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 在数字化工作环境中&#xff0c;电脑意外休眠往往导致工作中…...