2
votes

I am trying to create a priority queue consisting of pairs of int, char that gives me the pair with the greater int, but my code is not working properly. What am I doing wrong?

This is my comparator class:

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

And this is my priority queue:

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

But if I execute the code:

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

It returns 2, instead of 3. How do I fix my implementation of the priority queue?

2

2 Answers

4
votes

The same fix that Geordi La Forge would use: reverse the polarity:

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

The comparison function always implements strict weak ordering, a.k.a. the logical < operation. But priority_queue, by definition, gives you the largest value in the priority queue, first:

... provides constant time lookup of the largest (by default) element,

But the comparison function is still strict weak ordering:

A Compare type providing a strict weak ordering.

Slightly counter-intuitive, but after a while, it does make sense...

P.S.: The comparison function should be a const function, and take const parameters, for efficiency, as shown in my example; but that's an additional detail.

1
votes

Priority queue expects Comparator to implement less - as any other container requiring weak ordering. However, it works by placing the bigger element on top. Since you effectively implemented greater, you reversed the queue, and now the smallest element goes on top.

To fix the problem, change your comparator to return lesser of the two elements.