优先级队列未正确比较 C++

Posted

技术标签:

【中文标题】优先级队列未正确比较 C++【英文标题】:Priority Queue Not Comparing Correctly C++ 【发布时间】:2016-12-28 20:13:51 【问题描述】:

我正在尝试创建一个由成对的 int、char 组成的优先级队列,它为我提供了具有更大 int 的对,但我的代码无法正常工作。我做错了什么?

这是我的比较器类:

class Compare

public:
    bool operator() (pair<int, char>a, pair<int, char>b)
    
        return a.first > b.first;
    
;

这是我的优先队列:

priority_queue<pair<int, char>, vector<pair<int, char>>, Compare> party;

但是如果我执行代码:

party.push(make_pair(2, 'A'));
party.push(make_pair(3, 'B'));
cout<<party.top().first;

它返回 2,而不是 3。如何修复优先队列的实现?

【问题讨论】:

【参考方案1】:

Geordi La Forge 会使用相同的修复方法:反转极性:

bool operator() (const pair<int, char> &a, const pair<int, char> &b) const

    return a.first < b.first;

比较函数总是实现严格的弱排序,也就是逻辑&lt; 操作。但是priority_queue,顾名思义,gives you the largest value in the priority queue, first:

... 提供最大(默认)元素的恒定时间查找,

但是比较函数还是严格的弱排序:

提供严格弱排序的比较类型。

有点反直觉,但过了一会儿,它确实有道理......

P.S.:比较函数应该是const函数,并带const参数,为了效率,如我的例子所示;但这是一个额外的细节。

【讨论】:

事实上,关于效率的部分是有争议的。如果函数是内联的(应该这样),那根本不重要。在无法想象的情况下,按值传递会提供更好的性能,至少在 86_64 上是这样。【参考方案2】:

优先队列期望 Comparator 实现less - 就像任何其他需要弱排序的容器一样。但是,它通过将较大的元素放在顶部来工作。由于您有效地实现了greater,因此您颠倒了队列,现在最小的元素位于顶部。

要解决此问题,请将比较器更改为返回两个元素中较小的一个。

【讨论】:

以上是关于优先级队列未正确比较 C++的主要内容,如果未能解决你的问题,请参考以下文章

优先队列未按正确顺序排序

如何在 C++ 中正确使用优先级队列

使用自定义比较器声明 C++ 优先级队列的问题

具有比较器的优先级队列未按预期工作

优先级队列对对象排序不正确(用户定义的比较)

关于C++的权值优先队列的问题