![](/img/trans.png)
[英]std::priority_queue: Custom ordering without defining comparator class
[英]Logic behind the custom comparator for std::priority_queue
我正在嘗試為以下優先級隊列編寫自定義比較器:
priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> pq;
該對中的第一個int
是密鑰,第二個int
是密鑰的計數。 我希望我的優先隊列將計數最大的一對放在頂部。
以下是滿足我需要的函子:
class cmp{
public:
bool operator()(const pair<int,int> a, const pair<int,int> b)const{
return a.second < b.second;
}
};
我不太明白為什么這是正確的方法。 為什么比較器返回a.second < b.second
而不是a.second > b.second
,因為我想將計數最多的對放在頂部? 優先級隊列將如何實際使用這個比較器?
從std::priority_queue
的文檔:
請注意,
Compare
參數被定義為如果其第一個參數在弱排序中出現在其第二個參數之前,則它返回true
。 但是因為優先級隊列首先輸出最大的元素,所以“先來”的元素實際上是最后輸出的。
std::make_heap()
發生同樣的情況:提供一個返回a < b
的比較器std::make_heap()
std::less
所做的——導致這個函數模板構建一個max-heap ,即具有最高鍵的元素位於頂部堆的。 如果你想構建一個min-heap ,你必須傳遞operator>
而不是operator<
或者仍然使用operator<
但翻轉操作數。
總而言之, std::priority_queue
和用於處理二元堆的函數模板都對它們的元素進行排序,以便頂部對應於具有最高 key的元素。 但是,兩個鍵如何相互比較取決於您。 您可以通過提供自定義比較器來控制它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.