[英]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.