#c #c 17
#c #c 17
Вопрос:
Вот пример кода:
struct T
{
int x;
int y;
bool operator !=(const Tamp; t) const
{
return std::tie(x, y) != std::tie(t.x, t.y);
}
};
int main()
{
std::unordered_map<int, T> m1;
std::unordered_map<int, T> m2;
if (m1 != m2) //compilation error
{
}
}
Мне нужно использовать operator!=
для неупорядоченных карт. Код не компилируется, потому что operator==
не найден. Я могу исправить это таким образом:
bool operator ==(const Tamp; t) const
{
return std::tie(x, y) == std::tie(t.x, t.y);
}
а затем сравните карты таким образом:
if(!(m1 == m2))
Является ли это оптимальным решением или, может быть, есть способ использовать operator!=
напрямую?
Комментарии:
1. Если вы определите,
operator==
вы все равно сможете сравнивать свои карты сm1 != m2
.
Ответ №1:
Требования к сравнению std::unordered_map
заключаются в том, чтобы тип ключа был сравним по равенству. Это означает, что T
должен быть способен вычислять выражение, a == b
где a,b
оба типа T
.
Если все, что вы хотите сделать, это сравнить равенство этих отображений, вам следует вместо этого определить ==
оператор.
Если вы хотите использовать оба оператора, я предлагаю определить !=
в терминах ==
, как вы показали, но вы можете сделать это и наоборот.
Обратите внимание, что в C 20 вам нужно только определить, operator ==
и обратное operator !=
значение будет определено для вас.
Видеть https://en.cppreference.com/w/cpp/container/unordered_map/operator_cmp и https://en.cppreference.com/w/cpp/named_req/EqualityComparable для получения более подробной информации.