la déclaration d'une priority_queue en c++ avec un comparateur
Je suis en train de déclarer un priority_queue of nodes
, à l'aide de bool Compare(Node a, Node b)
comme le comparateur de fonction (ce qui est en dehors de la classe de nœud).
Ce que j'ai actuellement est:
priority_queue<Node, vector<Node>, Compare> openSet;
Pour une raison quelconque, je suis Error: "Compare" is not a type name
La modification de la déclaration de priority_queue <Node, vector<Node>, bool Compare>
me donne 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
?
Vous devez vous connecter pour publier un commentaire.
Vous devez déclarer une classe
Compare
et de la surchargeoperator()
, comme ceci:Ou, si pour certaines raisons, ne peuvent pas se rendre dans la classe, vous pouvez utiliser
std::function
pour elle:operator()
, il semble plus simple.pritority_queue
. Il est possible de surchargeroperator<
et de l'utilisation intégrée destd::less
de comparaison, cependant, labool Compare(Node a, Node b)
déclarée en dehors de la classeNode
, selon la question.std::function
solution. Voir ma réponse ci-dessous.Accepté la réponse vous fait croire que vous devez utiliser une classe ou un
std::function
comme comparateur. Ce n'est pas vrai! Comme cute_ptr réponse montre, vous pouvez passer un pointeur de fonction du constructeur. Toutefois, la syntaxe de le faire est beaucoup plus simple que de s'y manifeste:Qui est, il n'est pas nécessaire de coder explicitement la fonction de type de l', vous pouvez laisser le compilateur faire pour vous à l'aide de
decltype
.C'est très utile si le comparateur est un lambda. Vous ne pouvez pas spécifier le type d'un lambda dans tout autre moyen que d'utiliser
decltype
. Par exemple:Compare
est un lambda, ce qui est impossible d'écrire une déclaration pour), je ne sais pas de tous les pièges. Si vous souhaitez donner cette réponse plus de visibilité, upvote il! 😉f
à l'avance et ensuite remplacerCompare
avecf
?Compare
peut être une fonction lambda là, comme dans lesauto Compare = [](){};
. Mais vous devez l'utiliserdecltype(Compare)
, plutôt que dedecltype(&Compare)
.Le troisième paramètre de modèle doit être une classe qui a
operator()(Node,Node)
surchargé.Ainsi, vous aurez à créer une classe de cette façon:
Et puis vous allez utiliser cette classe comme le troisième paramètre de modèle comme ceci:
Répondre directement à votre question:
Le compilateur est vous dire exactement quel est le problème:
Compare
n'est pas un nom de type, mais une instance d'une fonction qui prend deuxNodes
et renvoie unbool
.Ce que vous avez besoin est de préciser la fonction de pointeur de type:
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)> openSet(Compare)
On peut également utiliser une fonction lambda.