如何创建一个优先级队列,先按第一个元素排序,然后再按第二个元素排序?
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>>
工作得很好,而你的不工作,因为比较方程式不正确 'strict enough'。
让我们取两对 p1 = (3,5) 和 p2 = (4,2),如果我们根据你的函数计算 p1 和 p2,它会输出 cmp(p1, p2) = true
因为 b.first > a.first // 4 > 3
.
另外,如果我们同样比较p2和p1(唯一不同的是p1和p2的顺序),会输出cmp(p2, p1) = true
,因为b.second > a.second // 5 > 2
。
什么都不说,当 a == b
时,如果我们将一些对与自身进行比较,它将是 false
。
因此编译器在再次比较相同的对时一定会遇到问题,但这次是相反的顺序。
由于这个问题没有包含很多关于你如何使用队列的细节,所以问题必须是这个。这就是 greater
工作而不是这个的原因。
如果你想自己做,你应该尝试一个更具体和严格的方程,尝试使用 &&
运算符而不是 ||
并考虑相等的变体。
希望对您有所帮助,几年前我遇到过类似的问题,当时我正在尝试按照自己的方式对对向量进行排序。
我根据我在向量中使用的内容创建了一个 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>>
工作得很好,而你的不工作,因为比较方程式不正确 'strict enough'。
让我们取两对 p1 = (3,5) 和 p2 = (4,2),如果我们根据你的函数计算 p1 和 p2,它会输出 cmp(p1, p2) = true
因为 b.first > a.first // 4 > 3
.
另外,如果我们同样比较p2和p1(唯一不同的是p1和p2的顺序),会输出cmp(p2, p1) = true
,因为b.second > a.second // 5 > 2
。
什么都不说,当 a == b
时,如果我们将一些对与自身进行比较,它将是 false
。
因此编译器在再次比较相同的对时一定会遇到问题,但这次是相反的顺序。
由于这个问题没有包含很多关于你如何使用队列的细节,所以问题必须是这个。这就是 greater
工作而不是这个的原因。
如果你想自己做,你应该尝试一个更具体和严格的方程,尝试使用 &&
运算符而不是 ||
并考虑相等的变体。
希望对您有所帮助,几年前我遇到过类似的问题,当时我正在尝试按照自己的方式对对向量进行排序。