Sobes.tech
Junior — Middle

როგორ ხორციელდება ობიექტების შედარება, რომლებიც გამოიყენება std::unordered_map-ის გასაღებად?

sobes.tech AI

პასუხი AI-სგან

std::unordered_map ობიექტებში, გასაღებები შედარებულია თანასწორობის ფუნქციით (Equality), რომელიც საწყისად არის std::equal_to<Key>.

საკვანძო დამატების ან ძიების დროს, პროცესი ასე ხდება:

  1. გასაღების ჰეშ-კოდის გამოთვლა ჰეშ-ფუნქციის (სტანდარტულად std::hash<Key>) გამოყენებით.
  2. შესაბამის კუბში (bucket) ძიება, სადაც შედარება ხდება == ოპერატორით ან განსაზღვრული თანასწორობის პრედიკატით.

თუ გასაღებები პერსონალიზებული ტიპებია, საჭიროა:

  • std::hash-ის სპეციალიზაციის განსაზღვრა ამ ტიპისთვის ან საკუთარი ჰეშ-ფუნქციის მიწოდება.
  • == ოპერატორის განსაზღვრა ან საკუთარი თანასწორობის ფუნქციის მიწოდება.

მაგალითი:

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;