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

How to intuitively understand larger than/less than operator in comparator of C++ priority queue container

本文关键字:比较器 大于 运算符 小于 何直观 C++ 队列 优先级      更新时间:2023-10-16

我总是对定义优先级队列容器的比较器感到困惑,不知道如何理解它。例如,我有一个vectorpair<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时第一次就把它做好。非常感谢。

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

比较运算符的含义始终保持"小于">,这意味着当compare(A, B)为真时,B的优先级高于A,并且会更早地从优先级队列返回。

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

在某种程度上,你感到有点不安是正确的,因为我们可以将最高优先级与更高的值联系起来,这可能会违反直觉。

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

我认为这种"反转"的直观原因与这样一个事实有关,即许多贪婪算法将较低的成本优先于较高的成本,为了管理这一点,这些算法可以使用成本的优先级队列。