Search code examples
c++stdpriority-queue

declaring a priority_queue in c++ with a custom comparator


I'm trying to declare a priority_queue of nodes, using bool Compare(Node a, Node b) as the comparator function (which is outside the node class).

What I currently have is:

priority_queue<Node, vector<Node>, Compare> openSet;

For some reason, I'm getting Error: "Compare" is not a type name

Changing the declaration to priority_queue <Node, vector<Node>, bool Compare>

gives me Error: expected a '>'

I've also tried:

priority_queue<Node, vector<Node>, Compare()> openSet;
priority_queue<Node, vector<Node>, bool Compare()> openSet;
priority_queue<Node, vector<Node>, Compare<Node, Node>> openSet; 

How should I correctly declare my priority_queue?


Solution

  • Note - You may also want to check other answers, especially the one with decltype and lambda


    You should declare a class Compare and overload operator() for it like this:

    class Foo
    {
    
    };
    
    class Compare
    {
    public:
        bool operator() (Foo, Foo)
        {
            return true;
        }
    };
    
    int main()
    {
        std::priority_queue<Foo, std::vector<Foo>, Compare> pq;
        return 0;
    }
    

    Or, if you for some reasons can't make it as class, you could use std::function for it:

    class Foo
    {
    
    };
    
    bool Compare(Foo, Foo)
    {
        return true;
    }
    
    int main()
    {
        std::priority_queue<Foo, std::vector<Foo>, std::function<bool(Foo, Foo)>> pq(Compare);
        return 0;
    }