Sobes.tech
Junior — Middle

Milyen speciális predikátumokat kell meghatározni a felhasználói típusok std::unordered_map-ban való használatához?

sobes.tech MI

Válasz az MI-től

Az std::unordered_map egyedi típusok használatához két dolgot kell meghatározni:

  1. Hash függvény — egy objektum vagy függvény, amely elfogadja a kulcsot, és visszaadja a hash értékét (egész szám). Ez általában az std::hash sablon specializálásával történik a típusodhoz, vagy saját hash függvény átadásával sablon paraméterként.

  2. Egyenlőség operátor — az operator== operátort kell definiálni a típusodhoz, hogy az unordered_map össze tudja hasonlítani a kulcsokat, és meg tudja állapítani, hogy egyenlőek-e.

Példa:

#include <unordered_map>
#include <string>

struct Key {
    int id;
    std::string name;

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

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

int main() {
    std::unordered_map<Key, int> map;
    map[{1, "test"}] = 42;
}

Ezek nélkül a meghatározások nélkül az unordered_map nem tudja helyesen tárolni és keresni a saját típusú kulcsokat tartalmazó elemeket.