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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM