@Justin:
Взгляд на мое примечание по представлению узлов. Если Вы используете ту схему, то
2 + (2)
может быть представлен как
.
/ \
2 ( )
|
2
Вам необходимо определить operator <
для Class1.
Карта должна сравнивать значения с помощью operator <и, следовательно, вам необходимо предоставить то же самое, когда пользовательский класс используется в качестве ключа.
class Class1
{
public:
Class1(int id);
bool operator <(const Class1& rhs) const
{
return id < rhs.id;
}
private:
int id;
};
На самом деле у вас нет , чтобы определить operator <
для вашего класса. Вы также можете создать для него класс объекта функции компаратора и использовать его для специализации std :: map
. Чтобы расширить ваш пример:
struct Class1Compare
{
bool operator() (const Class1& lhs, const Class1& rhs) const
{
return lhs.id < rhs.id;
}
};
std::map<Class1, int, Class1Compare> c2int;
Так получилось, что значение по умолчанию для третьего параметра шаблона std :: map
- std :: less
, который будет делегирован operator <
, определенный для вашего класса (и завершается ошибкой, если его нет). Но иногда вы хотите, чтобы объекты можно было использовать в качестве ключей карты, но на самом деле у вас нет никакой осмысленной семантики сравнения, и поэтому вы не хотите вводить людей в заблуждение, предоставляя operator <
в ваш класс только для этого. Если это так, вы можете использовать описанный выше трюк.
По умолчанию std :: map
(и std :: set
) используйте operator <
для определения сортировки. Следовательно, вам необходимо определить operator <
в вашем классе.
Два объекта считаются эквивалентными if! (A .
Если по какой-либо причине вы хотите использовать другой компаратор, можно изменить третий аргумент шаблона карты
,
Ключи должны быть сопоставимы, но вы не определили подходящий оператор <
для своего пользовательского класса.