簡體   English   中英

如何創建一個優先級隊列,先按第一個元素排序,然后再按第二個元素排序?

[英]How can I create a priority queue of pairs that's sorted by the first element and then by the second?

我根據我在矢量中使用的內容創建了一個 lambda comp,但它不起作用,我想知道它為什么不起作用以及如何正確地進行。

代碼:

auto cmp=[](const std::pair<int,int>& a,const std::pair<int,int>& b){
    return (b.first>a.first)||(b.second>a.second);
};
std::priority_queue<std::pair<int,int>,std::vector<std::pair<int,int>>,decltype(cmp)> q(cmp);

正如你在評論中提到的: std::greater<std::pair<int, int>>工作得很好,而你的不工作是因為比較方程式不夠“嚴格” - 正確。

讓我們取兩對 p1 = (3,5) 和 p2 = (4,2),如果我們根據您的 function 比較 p1 和 p2,它將 output cmp(p1, p2) = true因為b.first > a.first // 4 > 3

此外,如果我們以相同的方式比較 p2 和 p1(唯一的區別是 p1 和 p2 的順序),它將 output cmp(p2, p1) = true因為b.second > a.second // 5 > 2

什么都不說,當a == b時,如果我們將一些對與自身進行比較,它將是false

因此,編譯器在再次比較相同的對時肯定會遇到問題,但這次是相反的順序。

由於問題不包含有關如何使用隊列的許多細節,因此問題必須是這樣的。 這就是為什么greater工作而不是這個。 如果你想自己做,你應該嘗試更具體和嚴格的方程式,嘗試使用&&運算符而不是|| 並考慮相等的變體。

希望它能有所幫助,幾年前我遇到過類似的問題,當時我試圖用我的方式對向量對進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM