В настоящее время выполняется попытка отсортировать вектор объектов, каждый из которых содержит строку, в C ++.
Строки могут содержать буквы или цифры (из-за конструктивного ограничения это необходимо, поскольку компаратор можно изменить).
В настоящий момент класс объекта перегружен, поэтому при сравнении двух объектов сравниваются содержащиеся в них строки. Это работает до определенной степени - однако, когда я использую операцию сортировки (например, сортировку STL), чтобы упорядочить объекты, она сортирует три строки, такие как «1», «4», «12», в порядке «1», «12», «4». 4 больше 12, но так как сравнение начинается с самой левой цифры, происходит эта «неправильная» сортировка.
Моей первоначальной реакцией было изменить способ перегрузки операции сравнения. Сначала я бы проверил длину сравниваемой строки - это было бы явным признаком, если бы содержимое строки было больше или меньше.
// 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);
}
Эта операция приводит к сообщению «Выражение: недопустимый оператор <» во время выполнения.
] Есть идеи относительно того, где я делаю ошибку? Похоже, я смогу указать операции, как именно должна происходить операция сортировки - даже если она недействительна, поскольку в настоящее время я использую вектор для содержания объектов.
Компаратор во время инициализации 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;
}