Junior — Middle
Welche Eigenschaften muss eine Klasse haben, damit ihre Instanz als eindeutiger Bezeichner oder Schlüssel in Sammlungen verwendet werden kann?
sobes.tech KI
Antwort von AI
Чтобы экземпляр класса можно было использовать в качестве уникального идентификатора или ключа в коллекциях (например, в std::unordered_map или std::map), класс должен обеспечивать:
- Операцию сравнения на равенство (
operator==) — для проверки, равны ли два объекта. - Операцию сравнения порядка (
operator<) — если используетсяstd::mapили другие упорядоченные контейнеры. - Хеш-функцию — если используется
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;
}
Таким образом, класс должен быть сравним и иметь корректный хеш для использования в качестве ключа.