优先级队列无法正确比较C ++

时间:2016-12-28 20:13:52

标签: c++ priority-queue

我正在尝试创建一个由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.如何修复优先级队列的实现?

2 个答案:

答案 0 :(得分:4)

Geordi La Forge将使用的相同修正:颠倒极性:

bool operator() (const pair<int, char> &a, const pair<int, char> &b) const
{
    return a.first < b.first;
}

比较函数总是实现严格的弱排序,即a.k.a.逻辑<操作。但是priority_queue,根据定义,gives you the largest value in the priority queue, first

  

...提供最大(默认情况下)元素的常量时间查找,

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

  

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

略有反直觉,但过了一段时间,它确实有意义......

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

答案 1 :(得分:1)

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

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