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;