Actualmente intentar ordenar un vector de objeto, con cada objeto que contiene una cadena, en C++sobrecarga de operadores comparación en los resultados de C++ en "operador no válido <"
Las cadenas pueden contener letras o números (debido a una restricción de diseño , esto es necesario, ya que el comparador puede ser cambiado).
En este momento, la clase del objeto está sobrecargada, de modo que cuando se comparan dos objetos, se comparan las cadenas que contienen. Esto funciona hasta cierto punto; sin embargo, cuando uso una operación de clasificación (como STL sort) para ordenar los objetos, ordenará tres cadenas como "1", "4", "12", en el orden "1", "12", "4". 4 es mayor que 12, pero debido a que comienza comparando desde el dígito más a la izquierda, esta clasificación 'incorrecta' ocurre.
Mi respuesta inicial fue cambiar la forma en que estaba sobrecargando la operación de comparación. Primero verificaría la longitud de la cuerda que estaba comparando, lo que sería una señal reveladora si el contenido de la cuerda fuera más grande o más pequeño.
// 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);
}
estos resultados de operación en una "expresión: Operador no válido <" de mensajes en tiempo de ejecución.
¿Alguna idea de dónde estoy cometiendo un error? Parece que debería ser capaz de dictar a la operación exactamente cómo quiero que ocurra la operación de clasificación, incluso si no es válida, ya que actualmente estoy usando un vector para contener los objetos.
Comparador durante la inicialización del objeto 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;
}
¿Cuál es comparador? Publica el código para eso. –
¿puede mostrar la definición de comparador? –
@Mike y @Mario: el comparador se inicializa durante la inicialización de un objeto nodeRecord. Puedes ver esto arriba. – BSchlinker