tente actuellement de trier un vecteur d'objet, chaque objet contenant une chaîne, en C++Surcharger opérateur comparision dans les résultats en C + « opérateur invalide < »
Les chaînes peuvent contenir des lettres ou des chiffres (en raison d'une contrainte de conception , ceci est nécessaire, car le comparateur peut être changé).
Pour l'instant, la classe de l'objet est surchargée, de sorte que lorsque deux objets sont comparés, les chaînes qu'ils contiennent sont comparées. Cela fonctionne à un certain point - cependant, quand j'utilise une opération de tri (comme le tri STL) pour mettre les objets dans l'ordre, il va trier trois chaînes telles que "1", "4", "12", dans l'ordre "1", "12", "4". 4 est supérieur à 12, mais parce qu'il commence à se comparer à partir du chiffre le plus à gauche, ce type "incorrect" se produit.
Ma première réaction a été de changer la façon dont je surchargeais l'opération de comparaison. Je voudrais d'abord vérifier la longueur de la chaîne que je comparais - ce qui serait un signe révélateur si le contenu de la chaîne était plus grand ou plus petit.
// overloaded comparision operators
friend bool operator<(const nodeRecord & record1, const nodeRecord & record2){
// we need to deal with strings of different lengths...
if(record1.comparator.length() < record2.comparator.length())
return true;
else
return (record1.comparator < record2.comparator);
}
Cette opération se traduit par un message: lors de l'exécution "Expression opérateur invalide <".
Des idées sur l'endroit où je fais une erreur? Il semble que je devrais être capable de dicter à l'opération exactement comment je veux que l'opération de tri se produise - même si elle est invalide, puisque j'utilise actuellement un vecteur pour contenir les objets.
lors de l'initialisation de Comparator l'objet nodeRecord:
nodeRecord(int fromNode, int toNode, int connectionCost, bool compareByCost = false){
// take the provided stock information and insert it into the object
stringstream fromNodeSS;
fromNodeSS << fromNode;
this->fromNode = fromNodeSS.str();
stringstream toNodeSS;
toNodeSS << toNode;
this->toNode = toNodeSS.str();
this->connectionCost = connectionCost;
// set the comparator to our chosen comparision term
if (!compareByCost){
this->comparator = this->fromNode; // we use from node in this case, since we build the tree outwards
}
else{
stringstream ss;
ss << this->connectionCost;
this->comparator = ss.str(); // we use the connection cost in this case, to allow us to sort new connections
}
// set this as a non-null (active) record
this->nullRecord = false;
}
Qu'est-ce comparateur? Postez le code pour cela. –
pouvez-vous s'il vous plaît montrer la définition de comparateur? –
@Mike et @Mario - le comparateur est initialisé lors de l'initialisation d'un objet nodeRecord. Vous pouvez voir ceci ci-dessus. – BSchlinker