déclaration d'une file d'attente prioritaire en C++ avec un comparateur personnalisé

J'essaie de déclarer un priority_queue of nodes, en utilisant {[3] } comme fonction de comparaison (qui est en dehors de la classe node).

Ce que j'ai actuellement est:

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

Pour une raison quelconque, je reçois Error: "Compare" is not a type name

Changer la déclaration en priority_queue <Node, vector<Node>, bool Compare>

Donne-moi Error: expected a '>'

J'ai aussi essayé:

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

Comment dois-je déclarer correctement mon priority_queue?

48
demandé sur Steven Morad 2013-04-19 22:33:32

4 réponses

Vous devez déclarer une classe Compare et surcharge operator(), comme ceci:

class Foo
{

};

class Compare
{
public:
    bool operator() (Foo, Foo)
    {
        return true;
    }
};

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

Ou, si pour certaines raisons vous ne pouvez pas le faire en tant que classe, vous pouvez utiliser std::function pour cela:

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;
}
58
répondu soon 2013-04-19 19:01:27

Le troisième paramètre de modèle doit être une classe qui a operator()(Node,Node) surchargé. Vous devrez donc créer une classe de cette façon:

class ComparisonClass {
    bool operator() (Node, Node) {
        //comparison code here
    }
};

Et puis vous utiliserez cette classe comme le troisième paramètre de modèle comme ceci:

priority_queue<Node, vector<Node>, ComparisonClass> q;
9
répondu Mic 2013-04-19 18:46:18

Répondre directement à votre question:

J'essaie de déclarer un priority_queue de nœuds, en utilisant bool Compare(Node a, Node b) as the comparator function

Ce que j'ai actuellement est:

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

Pour une raison quelconque, je reçois une erreur:

"Compare" is not a type name

Le compilateur vous dit exactement ce qui ne va pas: Compare n'est pas un nom de type, mais une instance d'une fonction qui prend deux Nodes et renvoie un bool.
Ce dont vous avez besoin est de spécifier le type de pointeur de fonction:
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)> openSet(Compare)

3
répondu cute_ptr 2016-11-13 11:27:16

Accepté La réponse vous fait croire que vous devez utiliser une classe ou un std::function comme comparateur. Ce n'est pas vrai! La réponse de cute_ptr a montré comment passer une fonction au constructeur, mais il y a un moyen plus simple:

priority_queue<Node, vector<Node>, decltype(&Compare)> openSet(Compare);

C'est-à-dire qu'il n'est pas nécessaire d'encoder explicitement le type de la fonction, vous pouvez laisser le compilateur le faire pour vous.

2
répondu Cris Luengo 2018-02-05 20:56:27