C++ priority_queue的自定义比较方式

less对应“<”运算符,

greater对应">"运算符。

最近学习STL,发现STL默认都是使用()比较的,默认比较使用less(即'<'运算符),如sort(a,a+n),默认将数组按照递增的顺序来排序(前面的元素<后面的嘛),但是优先队列的源码比较奇特,虽然按道理使用less比较应该默认是小根堆(即堆顶元素最小),但是priority_queue<int, vector<int>, less<int> >却是大根堆,这是因为优先队列队首指向最后,队尾指向最前面的缘故,所以每次使用top()返回的都是队尾的元素。

对于结构体类型,如果想自定义比较方式,可以写成以下方式,这里要注意的就是priority_queue每次都是从队尾取元素的,所以使用top()返回的是排序后的最后一个元素

复制代码
#include <iostream>
#include <stdio.h>
#include <string.h> 
#include <queue>
#include <functional>

using namespace std;

struct node
{
    int a,b;
    int cost;
    
} nod[100];


//自定义比较类 
struct cmp
{
    //重载()运算符 
    bool operator()(const node& n1, const node& n2)
    {
        //比较操作,按cost从小到大排序,但是这里构造出来的堆每次使用top()返回的都是cost最大的那个元素,因为堆每次都是从队尾弹出元素 
        return n1.cost < n2.cost;
    }
};

int main()
{
    priority_queue<node, vector<node>, cmp > q;
    for(int i = 0; i < 5; ++i)
    {
        cin >> nod[i].a >> nod[i].b >> nod[i].cost;
        q.push(nod[i]);
    }
    
    while(!q.empty())
    {
        node x = q.top();
        cout << x.a << ' ' <<x.b << ' ' <<x.cost << endl;
        q.pop();
    }
    
    return 0;
}
复制代码

 

参考:https://blog.csdn.net/aamahone/article/details/82787184

 

posted @   拾月凄辰  阅读(1589)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示
主题色彩