【C++】Queue与Priority Queue
目录1. 简介容器适配器2. 核心接口与基本使用2.1 Queue 的基本使用2.2 Priority Queue 的基本使用3. Priority Queue 的仿函数与自定义类型3.1 切换为小根堆3.2 自定义类型的比较4. 经典算法实战4.1 Queue 实战4.2 Priority Queue 实战5. 为什么 Queue 默认 Deque而 Priority Queue 默认 Vector附录适配器的模拟实现 (封装)Queue 的封装Priority Queue 的封装1. 简介容器适配器在 C STL 中Queue队列和 Priority Queue优先队列都被归类为容器适配器而非标准容器。所谓适配器模式就是将特定容器类封装作为其底层容器类并提供一组特定的成员函数来访问其元素。Queue队列专门用于 FIFO先进先出上下文元素的流动规则是“队尾入队头出”。Priority Queue优先队列底层类似堆Heap结构。它并不遵循先进先出而是根据严格的弱排序标准保证每次出队的元素都是当前队列中最大或最小的元素。2. 核心接口与基本使用2.1 Queue 的基本使用Queue 的底层容器应至少支持empty、size、front、back、push_back、pop_front。默认情况下使用deque。接口名称功能说明push(val)/pop()队尾入队 / 队头出队front()/back()返回队头元素的引用 / 返回队尾元素的引用empty()/size()检测队列是否为空 / 返回有效元素个数2.2 Priority Queue 的基本使用Priority Queue 的底层容器必须支持随机访问迭代器如empty、size、front、push_back、pop_back因为它需要借助堆算法make_heap,push_heap,pop_heap来维护结构。默认情况下使用vector作为底层容器且默认是大根堆Max-Heap。接口名称功能说明push(val)在优先队列中插入元素并自动调整堆结构pop()删除优先队列中最大或最小的堆顶元素top()返回堆顶元素最大或最小元素empty()/size()检测是否为空 / 返回元素个数#includeiostream#includequeueusingnamespacestd;voidtest_priority_queue(){// 默认是大堆输出9 8 7 6 ...priority_queueintmax_pq;max_pq.push(3);max_pq.push(9);max_pq.push(1);coutMax Heap Top: max_pq.top()endl;// 输出 9}3. Priority Queue 的仿函数与自定义类型在使用优先队列时我们常常需要改变默认的大根堆行为或者存储自定义的数据类型。3.1 切换为小根堆要创建小根堆需要引入functional头文件并将第三个模板参数替换为greaterT。#includequeue#includefunctional// greater 算法的头文件// 创建小根堆底层按照大于号比较std::priority_queueint,std::vectorint,std::greaterintmin_pq;3.2 自定义类型的比较如果优先队列中存放自定义类型用户需要在自定义类型中提供或者的重载或者传入自定义的仿函数Functor。classDate{public:Date(intyear,intmonth,intday):_year(year),_month(month),_day(day){}// 大根堆需要重载 booloperator(constDated)const{if(_year!d._year)return_yeard._year;if(_month!d._month)return_monthd._month;return_dayd._day;}private:int_year,_month,_day;};voidtest_custom_type(){std::priority_queueDateq;q.push(Date(2023,10,1));q.push(Date(2023,11,11));// 这个会成为堆顶}4. 经典算法实战4.1 Queue 实战用队列实现栈思路使用两个队列q1,q2模拟栈。入栈直接进非空队列出栈时将非空队列前n-1个元素倒入空队列弹出最后剩下的那个元素即可。classMyStack{public:voidpush(intx){q1.empty()?q2.push(x):q1.push(x);}intpop(){std::queueintemptyQq1.empty()?q1:q2;std::queueintnonEmptyQq1.empty()?q2:q1;while(nonEmptyQ.size()1){emptyQ.push(nonEmptyQ.front());nonEmptyQ.pop();}inttopElementnonEmptyQ.front();nonEmptyQ.pop();returntopElement;}// top() 和 empty() 逻辑省略...private:std::queueintq1,q2;};4.2 Priority Queue 实战数组中的第K个最大元素思路将数组元素全部放入大根堆优先队列中然后执行k-1次pop()此时的堆顶元素就是第 K 大的元素。classSolution{public:intfindKthLargest(vectorintnums,intk){// 将数组中的元素先放入优先级队列中 (O(N) 建堆)std::priority_queueintp(nums.begin(),nums.end());// 将前 k-1 个最大的元素删除for(inti0;ik-1;i){p.pop();}returnp.top();}};5. 为什么 Queue 默认 Deque而 Priority Queue 默认 VectorQueue 为什么默认 Deque 而不支持 Vectorqueue强依赖头删pop_front和尾插push_back。deque在头部删除和尾部插入时效率极高时间复杂度为 O(1)。若用vector封装每次头删都需要挪动后续所有数据时间复杂度骤降为 O(N)。Priority Queue 为什么默认 Vector优先队列本质是一个堆完全二叉树的数组实现。堆的维护依赖大量的随机访问例如通过父节点索引i访问左右孩子2i1,2i2。vector提供了极致的随机访问性能和极高的空间缓存命中率因此是优先队列的最佳拍档。附录适配器的模拟实现 (封装)Queue 的封装#pragmaonce#includedequenamespacebit{templateclassT,classContainerstd::dequeTclassqueue{public:voidpush(constTx){_con.push_back(x);}voidpop(){_con.pop_front();}constTback(){return_con.back();}constTfront(){return_con.front();}boolempty()const{return_con.empty();}size_tsize()const{return_con.size();}private:Container _con;};}Priority Queue 的封装借用 STL 的堆算法push_heap,pop_heap即可极其优雅地实现优先队列适配器。#pragmaonce#includevector#includealgorithm// 包含堆算法#includefunctionalnamespacebit{templateclassT,classContainerstd::vectorT,classComparestd::lessTclasspriority_queue{public:priority_queue(){}templateclassInputIteratorpriority_queue(InputIterator first,InputIterator last):_con(first,last){// 建堆std::make_heap(_con.begin(),_con.end(),comp);}voidpush(constTx){_con.push_back(x);std::push_heap(_con.begin(),_con.end(),comp);// 向上调整}voidpop(){std::pop_heap(_con.begin(),_con.end(),comp);// 将堆顶移到末尾向下调整_con.pop_back();// 真正删除}constTtop()const{return_con.front();}boolempty()const{return_con.empty();}size_tsize()const{return_con.size();}private:Container _con;Compare comp;// 比较器对象};}

相关新闻

Ember模板中处理数组判断:is-array与is-empty助手实战教程

Ember模板中处理数组判断:is-array与is-empty助手实战教程

Ember模板中处理数组判断:is-array与is-empty助手实战教程 【免费下载链接】ember-truth-helpers Ember HTMLBars Helpers for {{if}} & {{unless}}: not, and, or, eq & is-array 项目地址: https://gitcode.com/gh_mirrors/em/ember-truth-helpers …

2026/7/27 14:00:52阅读更多 →
为什么选择VenoBox?这款Vanilla JS灯箱插件的优势与特点

为什么选择VenoBox?这款Vanilla JS灯箱插件的优势与特点

为什么选择VenoBox?这款Vanilla JS灯箱插件的优势与特点 【免费下载链接】VenoBox Responsive Vanilla JS lightbox plugin, suitable for images, videos, iFrames, inline contents 项目地址: https://gitcode.com/gh_mirrors/ve/VenoBox VenoBox是一款基于…

2026/7/27 13:58:52阅读更多 →
TPS65321A-Q1汽车级电源设计:峰值电流模式与环路补偿实战

TPS65321A-Q1汽车级电源设计:峰值电流模式与环路补偿实战

1. 项目概述与核心价值在汽车电子、工业控制这类对可靠性要求极高的领域,电源设计从来都不是一件小事。它不仅仅是把电压降下来、电流供上去那么简单,更关乎整个系统的稳定性、电磁兼容性(EMC)以及长期运行的寿命。我最近深度使用…

2026/7/27 13:58:52阅读更多 →
为什么你的SD人脸修复总发绿/失真?资深图像算法专家拆解色彩空间错配、GAN伪影与归一化陷阱

为什么你的SD人脸修复总发绿/失真?资深图像算法专家拆解色彩空间错配、GAN伪影与归一化陷阱

更多请点击: https://codechina.net 第一章:为什么你的SD人脸修复总发绿/失真?——问题现象与根本归因 人脸修复在 Stable Diffusion 中频繁出现绿色偏色、五官错位、皮肤纹理塑料化等异常,表面看是模型“画歪了”,实…

2026/7/27 15:24:12阅读更多 →
一个关于茶杯的笑话

一个关于茶杯的笑话

一只茶杯对茶壶说:"你每天被人端来端去,累不累?" 茶壶叹气:"没办法,谁让我肚子里有货呢。" 茶杯冷笑:"那你猜我为什么叫杯具?" 茶壶一愣:"为…

2026/7/27 15:24:12阅读更多 →
新手必看!mpv_thumbnail_script使用技巧:自动生成与手动触发缩略图

新手必看!mpv_thumbnail_script使用技巧:自动生成与手动触发缩略图

新手必看!mpv_thumbnail_script使用技巧:自动生成与手动触发缩略图 【免费下载链接】mpv_thumbnail_script A Lua script to show preview thumbnails in mpvs OSC seekbar, sans external dependencies 项目地址: https://gitcode.com/gh_mirrors/mp/…

2026/7/27 15:24:12阅读更多 →
OpCore Simplify终极指南:5分钟创建专业级黑苹果EFI配置的完整教程

OpCore Simplify终极指南:5分钟创建专业级黑苹果EFI配置的完整教程

OpCore Simplify终极指南:5分钟创建专业级黑苹果EFI配置的完整教程 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果安装的复杂…

2026/7/27 15:24:12阅读更多 →
企业私域商城系统选型指南:自研架构、源码私有化部署方案详解

企业私域商城系统选型指南:自研架构、源码私有化部署方案详解

一、前言 随着私域流量运营成为企业数字化转型核心抓手,小程序商城、多级分销平台、经销商订货系统、本地生活核销系统的市场需求持续爆发。 大量企业在自主搭建线上经营平台时,普遍遭遇外包开发、系统高并发崩溃、数据归属平台、分销模式违规封号、售后…

2026/7/27 15:24:12阅读更多 →
构建智能小说下载系统:novel-downloader技术架构与应用实践

构建智能小说下载系统:novel-downloader技术架构与应用实践

构建智能小说下载系统:novel-downloader技术架构与应用实践 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在数字阅读时代,小说内容的保存与离线阅读需求日益…

2026/7/27 15:22:12阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/27 1:14:52阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/27 1:14:56阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →