如何在C ++优先级队列容器的比较器中直观地理解大于/小于运算符

时间:2016-08-07 23:20:19

标签: c++ priority-queue

我总是对为优先级队列容器定义比较器感到困惑,并且不知道如何理解它。 例如,我有一个vector pair<int,int>,我想要按第二个字段值对这些对进行降序排序。

所以代码看起来像这样:

 struct Compare
    {
        bool operator()(pair<int,int> const &p1, pair<int,int> const &p2) const
        {
            return p1.second < p2.second;
        }
    };



priority_queue<pair<int,int>,vector<pair<int,int> >, Compare> pqueue;

如何在此处理解运算符"<",因为我认为它应该是">"第一次,并且必须根据结果进行更改。为什么降序排序"<"而不是">"?我只想在下次使用priority_queue时第一次拍摄时才能正确使用。谢谢。

2 个答案:

答案 0 :(得分:5)

优先级队列根据比较运算符返回 top 元素,这意味着当您逐个检索项目时,可以按降序顺序获取它们。

比较运算符的含义始终“小于”,这意味着当compare(A, B)为真时,B的优先级高于A,并且将从优先级队列中提前返回。

反转比较功能会反转从优先级队列中获取项目的顺序。具体而言,使用>代替<会将订单转换为升序

答案 1 :(得分:0)

在某种程度上,你感到有点不安是正确的,因为我们可以将最优先考虑的问题与较高的价值相关联,这可能是违反直觉的。

但是在优先级队列中,通常假设优先级顺序是从最低值到最高值。也就是说,集合的最小元素具有最高优先级,依此类推。

我认为这种“反转”的直观原因与许多贪婪算法优先考虑较低成本的优先级有关,为了对其进行管理,这些算法可以使用成本优先级队列。