0

0

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

尼克

尼克

发布时间:2026-02-01 19:57:38

|

674人浏览过

|

来源于php中文网

原创

std::priority_queue 默认是大根堆,顶部元素最大;其底层使用 std::less 比较器,使较小元素“优先级更高”;自定义类型需重载 operator

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

priority_queue 默认是大根堆还是小根堆

默认是大根堆,也就是顶部元素最大。这容易让人误解为“优先级高就先出”,但其实 std::priority_queue 的底层是 std::less 比较器,对类型 T 调用 a ,所以更大的元素被“优先”弹出。

常见错误:想实现最小堆却直接写 priority_queue,结果每次 top() 拿到的是最大值,和预期相反。

  • 要小根堆,必须显式指定比较器:priority_queue, greater>
  • greater 对应 a > b 判断逻辑,让更小的数“优先级更高”
  • 注意模板参数顺序固定:``,不能只改最后一个

自定义结构体怎么进 priority_queue

必须提供可调用的比较逻辑,否则编译失败,报错类似:invalid operands to binary expression ('const Node' and 'const Node')

最稳妥的方式是重载 operator,但要注意语义一致性——如果你希望小的 Node 先出队,就让 a 在 a 应该排在 b 前面时返回 true(即模拟“小于”关系)。

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

struct Node {
    int val, id;
    bool operator<(const Node& rhs) const {
        return val > rhs.val; // 注意这里是 >
    }
};
priority_queue pq; // 小根堆按 val
  • 别写成 val ,那会变成大根堆
  • 如果不想改结构体,可用 lambda + decltype,但 C++11 不支持 lambda 作模板参数,得用函数对象(struct + operator()
  • 成员变量若为 privateoperator 需声明为 friend 或提供 public getter

为什么传 greater 要加尖括号而 less 不用

因为 std::priority_queue 模板声明中第三个参数默认是 std::less,它是个类模板,实例化时需要类型信息;而 greater 是具体类型,必须带模板实参。

文心大模型
文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

下载

等价写法:priority_queue, less>priority_queue 效果一样,只是显式写出默认行为。

  • 漏掉 会编译失败:greater 不是类型,greater 才是
  • 容器类型第二个参数不能省略:比如想用 deque,必须写全 priority_queue, greater>
  • 所有比较器必须满足 Strict Weak Ordering,禁止用 =>= 等非严格序操作

priority_queue 和手写堆比有什么限制

它不支持修改中间元素、不支持随机访问、无法获取某个元素当前索引,也没有 decrease_keyincrease_key 接口。本质上是个“只能 push / top / pop”的黑盒堆。

典型陷阱:想更新已入队元素的优先级,结果只能重新 push 一个新节点,靠后续 top() 时检查是否过期(lazy deletion),额外维护一个标记数组或哈希表。

  • 无法遍历内部数据,size() 可查,但没有 begin()/end()
  • 内存布局不保证连续(虽然底层 vector 是连续的,但接口不暴露)
  • 多线程下不安全,push/pop 都需外部加锁

真要动态调整优先级,考虑 std::set 或第三方库如 boost::heap,而不是硬套 priority_queue

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

206

2023.10.12

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

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

532

2023.09.20

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

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

282

2025.06.09

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

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

192

2025.07.04

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

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

399

2023.07.18

堆和栈区别
堆和栈区别

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

575

2023.08.10

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

热门下载

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

精品课程

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

共102课时 | 6.9万人学习

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

共162课时 | 19.1万人学习

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

共119课时 | 12.6万人学习

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

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