STL File d'attente de Priorité sur la classe personnalisée
Je vais avoir beaucoup de mal à faire ma file d'attente de priorité à reconnaître de quel paramètre il doit trier par. J'ai surchargé le moins que l'exploitant dans ma classe personnalisée, mais il ne semble pas à l'utiliser. Voici le code correspondant:
Nœud.h
class Node
{
public:
Node(...);
~Node();
bool operator<(Node &aNode);
...
}
Node.cpp
#include "Node.h"
bool Node::operator<(Node &aNode)
{
return (this->getTotalCost() < aNode.getTotalCost());
}
getTotalCost() retourne un int
main.cpp
priority_queue<Node*, vector<Node*>,less<vector<Node*>::value_type> > nodesToCheck;
Ce qui me manque et/ou faire du tort?
Vous devez être dans le Chai de IA classe 🙂 stackoverflow.com/questions/1517854/...
De bonnes compétences de détective 😉
De bonnes compétences de détective 😉
OriginalL'auteur bmalicoat | 2009-10-09
Vous devez vous connecter pour publier un commentaire.
less<vector<Node*>::value_type>
Signifie que votre comparateur compare les pointeurs les uns des autres, ce qui signifie que votre vecteur sera triée par la mise en mémoire des nœuds.Vous voulez faire quelque chose comme ceci:
Noter que vous devez être const-correct dans votre définition de
totalCost
.EDIT: Maintenant que C++11 est ici, vous n'avez pas besoin d'hériter de std::binary_function plus (ce qui signifie que vous n'avez pas besoin d' #include fonctionnelle)
Vous disposez. Vous ne pouvez pas se spécialisent modèles avec des fonctions, tout types (à l'exclusion des conditions spécifiques). Les objets de fonction sont une partie très importante de la STL de programmation. Un grand livre à lire sur Scott Meyer Efficace STL. Il explique tout sur la STL et les meilleures façons d'en profiter.
Aussi, je tiens à souligner que
std::less<T>
est aussi un objet de fonction (c'est à dire, une structure avecoperator()
)Vous avez oublié un point-virgule après struct.
Pourquoi est-ce à l'aide de '.' et non '->"?
OriginalL'auteur rlbond
Vous avez besoin pour faire de votre paramètre
const
, car à partir de maintenant vous êtes en lui donnant un non-coût de référence, ce qui signifie que vous pouvez modifier l'objet que vous êtes en comparant avec. (Vous n'êtes pas, et ne devrait probablement pas).Vous n'êtes pas const-correct. Votre
operator<
ne pas faire des modifications pour le Nœud, de sorte que la fonction doit être const:Après, si vous avez de la difficulté à l'appel de la
getTotalCost()
fonction, il est probable qu'il n'est pas const. Marquer comme const si c'est pas déjà fait:Votre code est maintenant (plus) const-correct.
Sur une note de côté, les opérateurs binaires sont généralement mises en œuvre en dehors de la classe:
En fait, je suis en désaccord avec la définition de
operator<
en dehors de la classe dans certains cas. Si c'est claire qu'il est censé faire, je ne pense pas que c'est vraiment un gros problème pour la définir en tant que membre. De Plus il permet l'utilisation de Boost.Des opérateurs.OriginalL'auteur GManNickG