Sobes.tech
Junior — Middle

Aké špeciálne predikáty je potrebné definovať na použitie vlastných typov v std::unordered_map?

sobes.tech AI

Odpoveď od AI

Ak chcete použiť vlastné typy v std::unordered_map, musíte definovať dve veci:

  1. Hashovaciu funkciu — objekt alebo funkciu, ktorá prijme kľúč a vráti jeho hash (celé číslo). Toto sa zvyčajne robí špecializáciou šablóny std::hash pre váš typ alebo odovzdaním vlastnej hash funkcie ako parametra šablóny.

  2. Operátor porovnania rovnosti — musí byť definovaný operátor operator== pre váš typ, aby unordered_map mohla porovnávať kľúče a určiť, či sú rovnaké.

Príklad:

#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;
}

Bez týchto definícií unordered_map nemôže správne ukladať a vyhľadávať prvky s vlastnými typmi kľúčov.