0

0

C++怎么使用优先队列_C++中priority_queue用法【指南】

穿越時空

穿越時空

发布时间:2026-03-13 18:22:03

|

218人浏览过

|

来源于php中文网

原创

priority_queue默认是大根堆;要实现小根堆需显式指定greater<int>或自定义比较函数,且必须满足严格弱序(如a>b而非a>=b),否则行为未定义。

c++怎么使用优先队列_c++中priority_queue用法【指南】

priority_queue 默认是大根堆,不是小根堆

很多人一上来就写 priority_queue<int></int>,结果发现取出来的最大值总在顶部,想实现最小堆却得不到预期——因为 C++ 标准库的 priority_queue 默认用 less<t></t> 作为比较器,等价于大根堆。要改成小根堆,必须显式传入 greater<int></int>,且注意模板参数顺序不能错。

  • 正确写法:priority_queue<int vector>, greater<int>></int></int>
  • 漏掉第二个参数(容器类型)会编译失败,因为第三个参数依赖前两个的默认值
  • 如果用自定义类型,greater<mystruct></mystruct> 不会自动生效,必须重载 operator 或传入 lambda(C++20 起支持,但需用函数对象包装)
  • 性能上没差异,只是比较逻辑翻转;但误用会导致逻辑完全反向,调试时容易卡在“为什么 pop 出来的是最大值”这种问题上

自定义比较函数必须满足严格弱序

写 lambda 或仿函数时,返回 true 表示“第一个参数应该排在第二个参数前面”,也就是“第一个优先级更高”。但很多人直接照搬 sort 的写法,比如写成 (a, b) { return a >= b; },这就违反了严格弱序——相等时返回 true 会导致行为未定义,可能 crash 或死循环。

  • 正确写法(升序小根堆):(const int& a, const int& b) { return a > b; }
  • 错误写法:a >= ba (这其实是大根堆逻辑)、<code>abs(a) > abs(b)(若 a 和 b 符号不同,可能不满足传递性)
  • 调试技巧:把比较函数单独拎出来测试几组输入,确认对任意 a,b,c 都满足:若 a

priority_queue 没有迭代器,无法遍历或查找

它只提供 top()push()pop()empty()size() 这五个接口。想“看看队列里有没有某个值”或者“按某种条件删掉中间元素”,priority_queue 原生不支持——这不是疏漏,而是设计使然:堆结构天生不适合随机访问。

歌者PPT
歌者PPT

歌者PPT,AI 写 PPT 永久免费

下载
  • 常见误操作:用 for (auto x : pq) 编译失败;或试图用 find(pq.begin(), ...) ——它根本没有 begin()
  • 替代方案:真需要查找/删除中间元素,改用 setmultiset(注意去重逻辑);若只是偶尔检查,可额外维护一个 unordered_set 记录存在性
  • 性能陷阱:有人用 vector 存数据再每次 make_heap,看似灵活,但 push/pop 变成 O(n) ——不如直接换容器

移动语义下 push() 的效率陷阱

C++11 后 push() 支持右值引用重载,但如果你传入一个临时对象,又没写 std::move,编译器不一定能自动识别为可移动——尤其当对象有自定义移动构造函数但没声明 noexcept 时,某些 STL 实现会退回到拷贝。

立即学习C++免费学习笔记(深入)”;

  • 安全写法:pq.push(std::move(myHeavyObject)),尤其对字符串、vector 等大对象
  • 注意:top() 返回的是 const 引用,不能直接 move;如需转移所有权,得先 std::move(pq.top())pop(),但顺序不能反
  • 兼容性提醒:老项目若用 C++98 模式编译,所有 push 都走拷贝;升级标准后不加 move 可能没收益
实际用的时候,最常卡住的不是语法,而是“我以为它支持遍历”或者“我忘了比较函数要严格弱序”——这两个点一旦出错,表现往往不是报错,而是逻辑静默崩坏。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Sass和less的区别
Sass和less的区别

Sass和less的区别有语法差异、变量和混合器的定义方式、导入方式、运算符的支持、扩展性等。本专题为大家提供Sass和less相关的文章、下载、课程内容,供大家免费下载体验。

216

2023.10.12

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1031

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

613

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.3万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号