В настоящее время пытается отсортировать вектор объекта, где каждый объект содержит строку, в 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);
}
Эта операция приводит к появлению сообщения «Выражение: недопустимый оператор <» во время выполнения. </p>
Есть идеи, где я совершаю ошибку? Кажется, что я должен быть в состоянии диктовать операции точно, как я хочу, чтобы операция сортировки происходила - даже если она недопустима, поскольку в настоящее время я использую вектор для хранения объектов.
Компаратор при инициализации объекта 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;
}