Чтобы класс мог использоваться в качестве ключа в ассоциативных контейнерах (например, в
std::map или std::unordered_map), он должен удовлетворять определённым требованиям. 🚩Ассоциативные контейнеры на основе дерева
🟠Оператор сравнения
Класс должен иметь определённый оператор сравнения. По умолчанию,
std::map и std::set используют оператор operator< для сравнения ключей. Это необходимо, чтобы контейнер мог упорядочивать ключи. В этом примере класс MyKey имеет перегруженный оператор operator<, что позволяет использовать его в качестве ключа в std::map.#include <iostream>
#include <map>
class MyKey {
public:
int value;
MyKey(int v) : value(v) {}
bool operator<(const MyKey& other) const {
return value < other.value;
}
};
int main() {
std::map<MyKey, std::string> myMap;
myMap[MyKey(1)] = "one";
myMap[MyKey(2)] = "two";
for (const auto& pair : myMap) {
std::cout << pair.first.value << ": " << pair.second << std::endl;
}
return 0;
}
🚩Неупорядоченные ассоциативные контейнеры
🟠Функция хэширования
Класс должен быть хэшируемым. Это означает, что для него должна быть определена функция хэширования. В стандартной библиотеке C++ можно определить специализированный шаблон
std::hash для вашего класса.🟠Операторы сравнения на равенство
Класс должен иметь определённый оператор
operator==. В этом примере для класса MyKey определён оператор operator== и специализированный шаблон std::hash, что позволяет использовать его в качестве ключа в std::unordered_map.#include <iostream>
#include <unordered_map>
#include <functional>
class MyKey {
public:
int value;
MyKey(int v) : value(v) {}
bool operator==(const MyKey& other) const {
return value == other.value;
}
};
namespace std {
template <>
struct hash<MyKey> {
std::size_t operator()(const MyKey& k) const {
return std::hash<int>()(k.value);
}
};
}
int main() {
std::unordered_map<MyKey, std::string> myMap;
myMap[MyKey(1)] = "one";
myMap[MyKey(2)] = "two";
for (const auto& pair : myMap) {
std::cout << pair.first.value << ": " << pair.second << std::endl;
}
return 0;
}
Ставь 👍 и забирай 📚 Базу знаний