繁体   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