std::unordered_map — оператор != и определяемое пользователем значение

#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 для получения более подробной информации.