Sobes.tech
Junior — Middle

Как се извършва сравняването на обекти, използвани като ключове в std::unordered_map?

sobes.tech AI

Отговор от AI

Обектите std::unordered_map сравняват ключовете с помощта на функция за равенство (Equality), която по подразбиране е std::equal_to<Key>.

При добавяне или търсене на ключ се извършва:

  1. Изчисляване на хеш кода на ключа с помощта на хеш функцията (по подразбиране std::hash<Key>).
  2. Търсене в съответната кофа (bucket) чрез сравнение на ключовете с оператора == или зададен предикат за равенство.

Ако ключовете са потребителски типове, е необходимо:

  • Да се дефинира специализация на std::hash за този тип или да се предостави собствена хеш функция.
  • Да се дефинира оператор == или да се предостави собствена функция за сравнение.

Пример:

struct Key {
    int id;
    bool operator==(const Key& other) const {
        return id == other.id;
    }
};

namespace std {
    template<>
    struct hash<Key> {
        size_t operator()(const Key& k) const {
            return std::hash<int>()(k.id);
        }
    };
}

std::unordered_map<Key, std::string> map;