Назад к вопросам
Middle
81
questionbank

Что необходимо сделать с классом, чтобы его можно было использовать в качестве ключа в std::map или std::unordered_map?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Чтобы класс MyClass можно было использовать как ключ в std::map<MyClass, ValueType> и std::unordered_map<MyClass, ValueType>, необходимо:

Для std::map:

  1. Определить оператор < как нестатический член или свободную функцию.

    #include <string>
    
    class MyClass {
    public:
        int id;
        std::string name;
    
        // Оператор < для std::map
        bool operator<(const MyClass& other) const {
            if (id != other.id) {
                return id < other.id;
            }
            return name < other.name;
        }
    };
    

Для std::unordered_map:

  1. Определить функтор хеширования (hash function) для MyClass.

  2. Определить оператор == для сравнения на равенство.

    #include <functional> // Для std::hash
    #include <string>
    
    class MyClass {
    public:
        int id;
        std::string name;
    
        // Оператор == для std::unordered_map
        bool operator==(const MyClass& other) const {
            return id == other.id && name == other.name;
        }
    };
    
    // Специализация std::hash для MyClass
    // Это внешний функтор хеширования
    namespace std {
        template <>
        struct hash<MyClass> {
            size_t operator()(const MyClass& obj) const {
                // Комбинируем хеши полей
                size_t h1 = hash<int>{}(obj.id);
                size_t h2 = hash<std::string>{}(obj.name);
    
                // Простой способ комбинирования
                // Более сложные методы могут обеспечить лучшую производительность
                return h1 ^ (h2 << 1);
            }
        };
    }
    

Сводная таблица требований:

Требование std::map std::unordered_map Примечание
Оператор < Для упорядочивания
Оператор == Для сравнения на равенство
Функтор хеширования Для вычисления хеша ключа