Какие операторы сравнения по умолчанию для объектов?

Я обнаружил ошибку в своем коде, когда я забыл использовать собственный компаратор при сортировке контейнера структур. Это заставило меня задуматься о том, что он использовал как оператор 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 разместил соответствующую интересную ссылку в комментариях к своему ответу, которая связана: Как указатели могут быть полностью упорядочены?

4

Решение

Компаратором по умолчанию является стандартный шаблон std::less<T>, который просто использует x < y для двух предметов x а также y типа T, Есть много способов, которыми это может работать:

  • T является арифметическим, фундаментальным типом и используется встроенный оператор.

  • T является типом класса и имеет член operator<,

  • Есть бесплатная функция operator<(T const &, T const &),

  • Ваш пользовательский тип имеет функцию неявного преобразования во встроенный тип, который обеспечивает уникальный путь для вызова встроенного <,

Дополнительно можно специализироваться std::less для вашего пользовательского типа T,

9

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector