Sobes.tech
Junior — Middle

Ako sa vykonáva porovnanie objektov používaných ako kľúče v std::unordered_map?

sobes.tech AI

Odpoveď od AI

V objektoch std::unordered_map sa porovnávajú kľúče pomocou funkcie rovnosti (Equality), ktorá je predvolená ako std::equal_to<Key>.

Pri vkladaní alebo hľadaní kľúča sa vykonáva:

  1. Výpočet hash kódu kľúča pomocou hash funkcie (predvolene std::hash<Key>).
  2. Vyhľadávanie v príslušnej vedre (bucket) pomocou porovnania kľúčov cez operátor == alebo definovaný predikát rovnosti.

Ak sú kľúče vlastné typy, je potrebné:

  • Definovať špecializáciu std::hash pre tento typ alebo poskytnúť vlastnú hash funkciu.
  • Definovať operátor == alebo poskytnúť vlastnú funkciu porovnania rovnosti.

Príklad:

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;