Sobes.tech
Junior — Middle

Kuidas toimub std::unordered_map'is kasutatavate võtmete objektide võrdlus?

sobes.tech AI

Vastus AI-lt

Objektides std::unordered_map võrreldakse võtmeid võrdlusfunktsiooniga (Equality), mis vaikimisi on std::equal_to<Key>.

Võtme lisamisel või otsimisel toimub:

  1. Võtme hash-koodi arvutamine hash-funktsiooni abil (vaikimisi std::hash<Key>).
  2. Otsing vastavas ämbris (bucket), võrreldes võtmeid == operaatoriga või määratud võrdluspredikaadiga.

Kui võtmed on kasutaja määratud tüübid, on vajalik:

  • Spetsialiseerida std::hash selle tüübi jaoks või pakkuda oma hash-funktsiooni.
  • Määrata == operaator või pakkuda oma võrdlusfunktsioon.

Näide:

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;