std::map
и std::unordered_map
- это два разных типа контейнеров, которые оба предоставили отображение пары ключ-значение.Как они это делают, хотя это совершенно другое.
std::map
использует древовидную структуру для своей реализации.Обычно это RBTree, но может работать любое дерево, которое может гарантировать операции O(logN)
в худшем случае.Это означает, что он должен иметь только оператор сравнения для типа ключа, так как вы можете получить полное упорядочение и проверить равенство с помощью компаратора, который реализует строгое слабое упорядочение.Это означает, что у вас никогда не будет коллизии хеша, поскольку вы не используете хеш.
std::unordered_map
основан на реализации хеш-таблицы.Поскольку он хеширует ключ, вам нужен оператор хеширования.Вам также нужен оператор сравнения, поскольку два значения могут хэшировать одно и то же значение (коллизия хэшей).Без оператора сравнения вы не сможете определить, является ли дублирующий хеш действительно дублирующим элементом.