Sobes.tech
Junior — Middle

Hogyan történik az objektumok összehasonlítása, amelyeket kulcsként használnak az std::unordered_map-ban?

sobes.tech MI

Válasz az MI-től

Az std::unordered_map objektumokban a kulcsokat az egyenlőség (Equality) függvény segítségével hasonlítják össze, amely alapértelmezés szerint a std::equal_to<Key>.

Új elem beszúrásakor vagy keresésekor a folyamat a következő:

  1. A kulcs hash-kódjának kiszámítása a hash-függvény (alapértelmezés szerint std::hash<Key>) segítségével.
  2. A megfelelő kosárban (bucket) történő keresés a kulcsok == operátorral vagy egy megadott egyenlőség predikáttal.

Ha a kulcsok egyedi típusok, akkor szükséges:

  • Meghatározni a std::hash ezen típusra való specializációját vagy saját hash-függvényt biztosítani.
  • Meghatározni az == operátort vagy saját összehasonlító függvényt biztosítani.

Példa:

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;