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
?
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;
}
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;
Répondre directement à votre question:
J'essaie de déclarer un
priority_queue
de nœuds, en utilisantbool 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)
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.