zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Oracle必须要启动的服务
    Oracle_Kill_Session_终极篇
    oracle 修改用户密码
    ORA-01000-超出打开游标的最大数(解决及原因)
    ORA-00600 内部错误代码, 参数 [19004]
    done 多米诺pizza oa 考了spring boot编程
    ebay mettle印度网站oa 切换屏幕就报警
    done摩根史丹利m&t oa
    done peapod 不被太尊重的不面了
    有一点题 virtusa 空口说代码的电面
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/12821842.html
Copyright © 2011-2022 走看看