新闻中心
C++ priority_queue用法详解_C++优先队列自定义排序方法
priority_queue是C++中基于堆的容器适配器,默认为大顶堆,可通过自定义比较器实现小顶堆或复杂类型排序,常用于Dijkstra、Huffman等算法。

在C++中,priority_queue 是一个基于堆实现的容器适配器,用于维护一组元素,并始终能够快速访问最大(或最小)元素。默认情况下,它是一个大顶堆,即优先级最高的元素(最大值)位于顶部。
1. priority_queue 基本用法
头文件:
基本声明方式:
-
priority_queue<int> pq;</int>:存储整数的大顶堆 -
priority_queue<int vector>, greater<int>> pq;</int></int>:小顶堆
常用操作:
- push(x):插入元素 x
- top():获取堆顶元素(不删除)
- pop():弹出堆顶元素
- empty():判断是否为空
- size():返回元素个数
示例代码:
#include <iostream>
#include <queue>
using namespace std;
int main() {
priority_queue<int> pq;
pq.push(3);
pq.push(1);
pq.push(4);
pq.push(2);
while (!pq.empty()) {
cout << pq.top() << " "; // 输出:4 3 2 1
pq.pop();
}
return 0;
}
2. 自定义排序:基础结构体
当需要处理复杂类型(如结构体)时,可以通过重载比较函数来自定义优先级规则。
方法一:重载 operator
由于默认使用 less<t></t>,会调用 operator,所以让“优先级高的”返回 false。
struct Student {
string name;
int age;
// 按年龄从小到大排,年龄小的优先级高(小顶堆效果)
bool operator<(const Student& other) const {
return age > other.age; // 注意:这里反着写
}
};
priority_queue<Student> pq;
注意:operator 返回 true 表示当前对象小于 other。但在大顶堆中,大的在上面。所以为了让年龄小的优先,必须让 age 小的对象“看起来更大”,因此写成 <code>age > other.age。
3. 使用仿函数(Functor)自定义比较器
更清晰的方式是定义一个比较类,实现 operator()。
struct CompareAge {
bool operator()(const Student& a, const Student& b) const {
return a.age > b.age; // 年龄小的优先
}
};
// 声明时指定第三个模板参数
priority_queue<Student, vector<Student>, CompareAge> pq;
此时,返回 true 表示 a 的优先级低于 b,即 b 应该排在前面。这和 sort 的比较函数逻辑
一致:true 表示需要交换。
常见错误:误以为返回 true 是“优先”,实际上在 priority_queue 中,比较器的作用是判断谁该被放在下面。如果 cmp(a,b)==true,说明 a 的优先级比 b 低,b 应该浮到上面。
4. 使用 lambda 表达式?不行!但可以用 decltype 配合函数对象
不能直接在模板参数中使用 lambda,但可以配合 decltype 和构造函数使用:
auto cmp = [](const Student& a, const Student& b) { return a.age > b.age; };
priority_queue<Student, vector<Student>, decltype(cmp)> pq(cmp);
注意:这里必须把 cmp 作为参数传入构造函数,否则无法推导行为。
适用场景:比较逻辑复杂且只在局部使用时,这种方式更灵活。
5. 常见应用场景
- Dijkstra 算法:取出距离最小的节点
- Huffman 编码:合并频率最小的两棵树
- 合并多个有序链表:用小顶堆维护每个链表的当前头节点
- 滑动窗口最大值:可用 priority_queue 辅助实现
例如:Dijkstra 中通常这样定义:
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 或者自定义比较器,按距离排序基本上就这些。关键点是理解默认是大顶堆,自定义比较器时要明确“谁优先谁靠上”,返回 true 表示第一个参数优先级更低。不复杂但容易忽略细节。
以上就是C++ priority_queue用法详解_C++优先队列自定义排序方法的详细内容,更多请关注其它相关文章!
# 多个
# 江干区网站优化推广服务
# 网络营销大面积推广
# 掇刀seo优化口碑好
# 无锡网站建设优化技术
# 绥德关键词排名优化软件
# 商丘seo网站优化推荐
# 关键词快速排名软件
# 铁岭本地网站建设流程
# 网站推广是什么技术
# 湖南网站建设怎么样
# 更大
# 可以用
# 编码
# 第一个
# 放在
# 链表
# 是一个
# 返回值
# 如何使用
# 自定义
# stream
# ios
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
jQuery Mask 插件中实现电话号码固定前导零的教程
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
QQ网页版官方账号入口 QQ网页版网页版登录指南
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
押井守高度称赞《辐射4》:玩了八年都停不下来!
BetterDiscord插件中安全更新用户简介的实践指南
LINUX怎么设置定时任务_LINUX crontab配置教程
一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证
qq游戏大厅官方下载_qq游戏免费下载安装入口
Python字典中优雅地迭代剩余元素的方法
Django模型中自动计算可用余额的实现方法
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
J*aScript中针对特定容器内图片动画的实现教程
拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达
蛙漫安全无毒 官方认证的绿色入口
免费抖音短视频入口_抖音网页版短视频免费通道
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
Django通过AJAX异步上传图片并保存至模型的完整指南
漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口
韩小圈电脑版在线入口_网页版免费登录地址
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
C++ explicit关键字防止隐式转换_C++构造函数安全规范
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
实现分段式页面滚动导航:CSS与J*aScript教程
在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全
优化大型XML文件解析:基于Python流式处理的内存高效方案
深入理解J*a链表中的IPosition接口与使用
知音漫客官网漫画下载_知音漫客网页版阅读记录
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
我的世界官方游戏入口 我的世界官网平台直达链接
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
b站怎么取消点赞_b站点赞取消操作方法
qq游戏手机版下载安装_qq游戏移动端入口
照顾宝贝2小游戏免费秒玩入口
利用Bokeh CustomJS动态控制DataTable列可见性
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
Node.js中HTML按钮与J*aScript函数交互的正确姿势
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
解决Tabulator日期时间排序问题的专业指南
J*a递归快速排序中静态变量的状态管理与陷阱
谷歌邮箱注册显示错误Gmail服务器异常与延迟处理
邮政快递单号查询入口 邮政快递物流信息在线查询入口
qq游戏网页版直接玩_qq游戏免下载快速入口
蛙漫官方正版入口 蛙漫网页在线全集免费观看
如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
SteamMachine定价或为699美元 大家想入手吗?


2025-12-02
浏览次数:次
返回列表