Я обнаружил ошибку в своем коде, когда я забыл использовать собственный компаратор при сортировке контейнера структур. Это заставило меня задуматься о том, что он использовал как оператор less, поскольку я не определил ни одного для структуры.
Как сравниваются объекты <,> и == когда эти операторы не определены? Это по адресу памяти? Это определено в стандарте? Я не смог найти эту информацию в Google.
РЕДАКТИРОВАТЬ:
Вот класс, который я использовал:
using namespace std;
typedef unsigned id;
class LogEntry {
id master_id;
string timestamp;
string category;
string message;
string str_rep;
public:
LogEntry(id id, string t, string c, string m) :
master_id(id), timestamp(t), category(c), message(m) {
}
string get_timestamp() const {
return timestamp;
}
string get_category() const {
return category;
}
string get_message() const {
return message;
}
string to_string() {
ostringstream ss;
ss << master_id << "|" << timestamp << "|" << category << "|"<< message;
return ss.str();
}
id get_id() const {
return master_id;
}
};
EDIT2:
Я понял, что сделал глупую ошибку. Я хранил вектор указателей на объекты. Таким образом, весьма вероятно, что указатели сравниваются по адресу. Если бы я не хранил указатели, я не думаю, что он скомпилировался бы.
EDIT3:
KerrekSB разместил соответствующую интересную ссылку в комментариях к своему ответу, которая связана: Как указатели могут быть полностью упорядочены?
Компаратором по умолчанию является стандартный шаблон std::less<T>
, который просто использует x < y
для двух предметов x
а также y
типа T
, Есть много способов, которыми это может работать:
T
является арифметическим, фундаментальным типом и используется встроенный оператор.
T
является типом класса и имеет член operator<
,
Есть бесплатная функция operator<(T const &, T const &)
,
Ваш пользовательский тип имеет функцию неявного преобразования во встроенный тип, который обеспечивает уникальный путь для вызова встроенного <
,
Дополнительно можно специализироваться std::less
для вашего пользовательского типа T
,
Других решений пока нет …