Sobes.tech
Middle

Чӣ бояд кард, то сохтори худро дар unordered_map нигоҳ доред?

sobes.tech AI

Ҷавоб аз AI

Барои нигоҳ доштани сохтор ҳамчун калид дар std::unordered_map, бояд пешниҳод кунед:

  1. Функсияи хеш (hash function): Меъёри хешро барои намунаи сохтор меёбад.
  2. Оператори муқоиса барои баробарӣ (operator==): Ду намунаи сохторро барои баробарӣ муқоиса мекунад.

Ин элементҳоро бо чанд роҳ пешниҳод кардан мумкин аст:

  • operator==-ро дар дохили сохтор барқарор кунед ва std::hash-ро барои сохтори шумо махсус кунед. Ин усули маъмул ва тавсияшуда аст.

    #include <unordered_map>
    #include <string>
    #include <functional>
    
    struct MyStruct {
        int id;
        std::string name;
    
        bool operator==(const MyStruct& other) const {
            return id == other.id && name == other.name;
        }
    };
    
    // Тасҳеҳ кардани std::hash барои MyStruct
    namespace std {
        template <>
        struct hash<MyStruct> {
            size_t operator()(const MyStruct& obj) const {
                size_t h1 = hash<int>()(obj.id);
                size_t h2 = hash<std::string>()(obj.name);
                return h1 ^ (h2 << 1);
            }
        };
    }
    
    // Мисол дар main
    int main() {
        std::unordered_map<MyStruct, int> my_map;
        MyStruct key1 = {1, "Alice"};
        MyStruct key2 = {2, "Bob"};
        MyStruct key3 = {1, "Alice"}; // баробар бо key1
    
        my_map[key1] = 10;
        my_map[key2] = 20;
    
        if (my_map.count(key3)) {
            // my_map[key3] ба 10 хоҳад буд
        }
    
        return 0;
    }
    
  • Функсияҳои хеш ва муқоиса ҳамчун параметрҳои ҷудогона дар шablонро дар вақти эълон кардани unordered_map пешниҳод кунед. Ин камтар қулай аст, агар шумо бештар истифодаи сохторро ҳамчун калид дошта бошед, зеро ҳар бор бояд намудҳои муқоиса ва хешро нишон диҳед.

    #include <unordered_map>
    #include <string>
    #include <functional>
    
    struct MyStruct {
        int id;
        std::string name;
    };
    
    // Функсияи хеши ҷудогона
    struct MyStructHash {
        size_t operator()(const MyStruct& obj) const {
            size_t h1 = std::hash<int>()(obj.id);
            size_t h2 = std::hash<std::string>()(obj.name);
            return h1 ^ (h2 << 1);
        }
    };
    
    // Функсияи муқоиса ҷудогона (ё functor)
    struct MyStructEqual {
        bool operator()(const MyStruct& lhs, const MyStruct& rhs) const {
            return lhs.id == rhs.id && lhs.name == rhs.name;
        }
    };
    
    // Мисол дар main
    int main() {
        std::unordered_map<MyStruct, int, MyStructHash, MyStructEqual> my_map;
        MyStruct key1 = {1, "Alice"};
        MyStruct key2 = {2, "Bob"};
    
        my_map[key1] = 10;
        my_map[key2] = 20;
    
        return 0;
    }
    

Мавзӯъҳои муҳим:

  • Дурустии функсияи хеш: Барои ҳар ду калид a ва b, агар a == b, пас hash(a) бояд баробар бо hash(b) бошад. Баръакс, метавонад коллизияҳо рӯй диҳанд.
  • Сифати функсияи хеш: Функсияи хуби хеш ба таври баробар тақсим мекунад, то ки коллизияҳоро кам кунад ва иҷрои беҳтарро таъмин кунад (O(1) дар миёна).
  • Константӣ: Операторҳои муқоиса ва функсияи хеш бояд const бошанд, зеро онҳо набояд объекти калидро тағир диҳанд.