0

0

c++如何使用priority_queue_c++优先队列大顶堆小顶堆【总结】

冰火之心

冰火之心

发布时间:2026-02-15 16:00:15

|

457人浏览过

|

来源于php中文网

原创

默认是大顶堆(最大元素在队首),底层使用std::less比较器;小顶堆需自定义比较器,如std::greater或仿函数,返回true表示第一个参数优先级更低。

c++如何使用priority_queue_c++优先队列大顶堆小顶堆【总结】

默认就是大顶堆,小顶堆得手动改比较器,不是加个参数就能切的。

priority_queue 默认是大顶堆还是小顶堆?

默认是大顶堆(最大元素在队首)。它底层用 std::less 作为比较器,等价于 std::less<int></int>,即 a 为真时认为 <code>a 优先级更低——所以大的数“浮”在上面。

  • 这意味着 top() 返回的是当前最大值
  • 插入 1, 5, 3 后,top()5,不是 1
  • 别被“queue”字面意思误导,它不按插入顺序排,而是按值大小排

怎么声明一个小顶堆?

必须显式传入比较器类型,不能靠函数参数或构造时传 lambda(C++17 前不支持),最常用写法是用 std::greater

std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap;

注意三个模板参数缺一不可:

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

  • 第一个是元素类型(int
  • 第二个是容器类型(必须是支持随机访问且有 push_back/pop_back 的,std::vector 最常用)
  • 第三个是比较器(std::greater<int></int> 表示 a > ba 优先级更低,所以小的在顶)

别写成 priority_queue<int greater>></int> —— 缺少容器类型,编译直接报错。

自定义类型怎么用 priority_queue?

要么重载 operator,要么传自定义比较器。重载 <code> 最简单,但语义要清晰:

struct Node {
    int val;
    bool operator<(const Node& rhs) const {
        return val < rhs.val; // 这会让大 val 在顶 → 大顶堆
    }
};

如果想让小 val 在顶,就得反过来写:return val > rhs.val;。容易写反,建议统一用外部比较器:

struct Compare {
    bool operator()(const Node& a, const Node& b) const {
        return a.val > b.val; // 小顶堆:a 比 b 大,a 优先级更低
    }
};
std::priority_queue<Node, std::vector<Node>, Compare> pq;

注意:这个 Compare 的逻辑和 std::greater 一致——返回 true 表示第一个参数“应该排在后面”,不是“谁更大”。这点最容易绕晕。

常见错误和性能注意点

几个高频翻车现场:

  • 误以为 priority_queue 支持 find 或遍历访问中间元素 —— 它只保证 top() 是极值,其余元素无序,不能索引
  • std::priority_queue 当作可修改堆(比如改某个元素后自动调整)—— 不支持,只能 push/pop
  • 在循环里反复创建临时 priority_queue 却没清空,导致内存缓慢增长(尤其在 long-running 服务中)
  • std::deque 替代 std::vector 作底层容器 —— 不合法,deque 不满足 RandomAccessContainer 要求,编译失败

底层调整复杂度是 O(log n),但每次 top()O(1);如果只是找最小/最大值且不删,用 std::min_element 可能更轻量。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

211

2023.10.12

string转int
string转int

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

730

2023.08.02

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

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

565

2024.08.29

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

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

214

2025.08.29

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

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

209

2025.08.29

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

58

2026.01.05

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

139

2026.02.13

热门下载

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

精品课程

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

共94课时 | 9.5万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.9万人学习

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

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