2016-12-28 90 views
2

我想創建一個優先隊列組成的對int,char,給我一對更大的int,但我的代碼無法正常工作。我究竟做錯了什麼?優先級隊列不能正確比較C++

這是我比較類:

class Compare 
{ 
public: 
    bool operator() (pair<int, char>a, pair<int, char>b) 
    { 
     return a.first > b.first; 
    } 
}; 

這是我的優先級隊列:

priority_queue<pair<int, char>, vector<pair<int, char>>, Compare> party; 

但如果我執行的代碼:

party.push(make_pair(2, 'A')); 
party.push(make_pair(3, 'B')); 
cout<<party.top().first; 

它返回2,而不是3.如何修復我的優先級隊列的實現?

回答

3

相同的修訂是鷹眼拉弗格將使用:反向極性:

bool operator() (const pair<int, char> &a, const pair<int, char> &b) const 
{ 
    return a.first < b.first; 
} 

比較函數始終貫徹嚴格的弱序,又名邏輯<操作。但是priority_queue,顧名思義,gives you the largest value in the priority queue, first

...提供了最大的(默認)元素的恆定時間的查找,

但比較功能仍然是嚴格弱序:

提供嚴格弱排序的比較類型。

略反直覺的,但經過一段時間,它有一定道理...

PS:比較函數應該是一個const功能,並採取const參數,以提高效率,如在我例;但這是一個額外的細節。

+0

事實上,關於效率的部分是有爭議的。如果函數內聯(應該如此),它根本就沒有關係。在不可想象的情況下,價值傳遞會提供更好的表現,至少在86_64上。 – SergeyA

1

優先級隊列期望比較器執行less-與任何其他需要弱排序的容器一樣。但是,它通過將更大的元素放在頂部工作。由於您有效實施了greater,因此您排隊了,現在最小的元素排在最前面。

要解決該問題,請將比較器更改爲返回兩個元素中的較小者。