0

0

C++ priority_queue怎么用 C++ 优先队列自定义排序写法【堆】

尼克

尼克

发布时间:2026-01-26 13:32:03

|

745人浏览过

|

来源于php中文网

原创

priority_queue默认是大根堆,要小根堆需显式指定容器和比较器:priority_queue pq;自定义排序须用仿函数类,operator()返回true表示a优先级低于b。

c++ priority_queue怎么用 c++ 优先队列自定义排序写法【堆】

priority_queue 默认是大根堆(最大堆),想用小根堆或自定义排序,不能直接传 lambda,得靠仿函数或 std::greater

怎么让 priority_queue 变成小根堆

默认构造的 priority_queue 顶部是最大值;要最小值在顶,必须显式指定容器和比较器:

  • std::greater:需要包含 ,且第三个模板参数填它
  • 底层容器默认是 std::vector,第二个参数必须写出来(即使不改)

正确写法:

priority_queue, greater> pq;
错写成 priority_queue> 会编译失败——少了一个模板参数。

自定义结构体排序:必须写仿函数类

lambda 不能作为模板非类型参数,所以不能直接传。得定义一个可调用类型:

  • 重载 operator() 的 struct/class(推荐,清晰、可复用)
  • 注意返回值语义:返回 true 表示第一个参数“优先级更低”,即排在后面(priority_queue 是“less 为大根,greater 为小根”,本质是“判断 a 是否该排在 b 后面”)
  • 比如按 Node.val 升序排(小根),仿函数里写 a.val > b.val

示例:

struct Node { int val; };
struct Compare {
bool operator()(const Node& a, const Node& b) {
return a.val > b.val; // 小根堆:val 小的在顶
}
};
priority_queue, Compare> pq;

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

Kira
Kira

AI创意图像生成与编辑平台

下载

用 function 对象或函数指针?不推荐

理论上可以传函数指针或 std::function,但会导致运行时开销(虚调用/堆分配),且模板实例化更复杂:

  • priority_queue, function> 要求每次构造时传比较函数,无法作为类成员静态声明
  • 编译器难优化,性能不如仿函数类
  • 绝大多数场景没必要,仿函数完全够用

真要动态改逻辑,建议封装一层,内部仍用固定仿函数 + 外部状态变量控制行为。

常见编译错误和坑

这些错几乎都源于模板参数顺序或语义理解偏差:

  • error: type/value mismatch at argument 3:第三个参数不是类型(比如写了 greater() 带括号,应去掉)
  • 堆顶结果和预期相反:检查仿函数里 operator() 返回逻辑,记清楚“返回 true = a 优先级低于 b”
  • 结构体没写 const 引用参数:导致大量拷贝,尤其对象大时明显变慢
  • 忘记指定底层容器(第二个参数):priority_queue 是非法的,必须写全三个

最易忽略的是:仿函数里的比较逻辑和直觉相反——它不是“是否应该交换”,而是“是否应该把 a 放在 b 下面”。这个反直觉点,调试时花的时间往往比写代码还多。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

202

2023.10.12

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

291

2023.10.25

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

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

527

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

220

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

190

2025.07.04

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

220

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

190

2025.07.04

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.8万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 19万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.5万人学习

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

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