Priority queue of pairs in reverse order

bqui56 picture bqui56 · May 26, 2012 · Viewed 16.7k times · Source

I'm wanting to do something like this:

priority_queue< pair<int, int>, vector<int>, greater<int> > Q;

This works fine if the type I'm comparing is int, i.e.:

priority_queue< int, vector<int>, greater<int> > Q;

however, obviously with the pair<int, int>, there is no way of comparing the pairs in the queue with the standard >. I was wondering what I should do? How would I implement an overloaded > or is there another way I can create a priority queue of pairs with the smallest pair.second being at the top of the queue?

Answer

Peter Alexander picture Peter Alexander · May 26, 2012

Have you tried this?

typedef pair<int, int> P;
priority_queue< P, vector<P>, greater<P> > Q;

This will give the reverse ordering of the normal operator< for pair<int, int>, which will start with the smallest first tie-broken with smallest second.

If you want to sort by smallest second first and first second (!) then you'll need a new sorting functor:

struct Order
{
    bool operator()(P const& a, P const& b) const
    {
        return a.second < b.second || a.second == b.second && a.first < b.first;
    }
}

Then use:

priority_queue< P, vector<P>, Order > Q;