Sobes.tech
Junior — Middle

Welke eigenschappen moet een klasse hebben zodat een instantie ervan kan worden gebruikt als een unieke identificator of sleutel in collecties?

sobes.tech AI

Antwoord van AI

Чтобы экземпляр класса можно было использовать в качестве уникального идентификатора или ключа в коллекциях (например, в std::unordered_map или std::map), класс должен обеспечивать:

  1. Операцию сравнения на равенство (operator==) — для проверки, равны ли два объекта.
  2. Операцию сравнения порядка (operator<) — если используется std::map или другие упорядоченные контейнеры.
  3. Хеш-функцию — если используется std::unordered_map или std::unordered_set. Для этого можно специализировать шаблон std::hash для вашего класса.

Пример для использования в std::unordered_map:

#include <string>
#include <unordered_map>

class MyKey {
public:
    int id;
    std::string name;

    bool operator==(const MyKey& other) const {
        return id == other.id && name == other.name;
    }
};

namespace std {
    template<> struct hash<MyKey> {
        size_t operator()(const MyKey& k) const {
            return hash<int>()(k.id) ^ (hash<std::string>()(k.name) << 1);
        }
    };
}

int main() {
    std::unordered_map<MyKey, int> map;
    map[{1, "test"}] = 42;
}

Таким образом, класс должен быть сравним и иметь корректный хеш для использования в качестве ключа.