Junior — Middle
98
Какие специальные предикаты необходимо определить для использования пользовательских типов в std::unordered_map?
Companies where asked
Телкор
Answer from AI
sobes.tech AI
Для использования пользовательских типов в std::unordered_map необходимо определить две вещи:
-
Хеш-функцию — объект или функцию, которая принимает ключ и возвращает его хеш (целочисленное значение). Обычно это делается через специализацию шаблона
std::hashдля вашего типа или через передачу собственного хеш-функтора в качестве параметра шаблона. -
Оператор сравнения равенства — должен быть определён оператор
operator==для вашего типа, чтобыunordered_mapмог сравнивать ключи и определять, равны ли они.
Пример:
#include <unordered_map>
#include <string>
struct Key {
int id;
std::string name;
bool operator==(const Key& other) const {
return id == other.id && name == other.name;
}
};
namespace std {
template<> struct hash<Key> {
size_t operator()(const Key& k) const {
return hash<int>()(k.id) ^ (hash<std::string>()(k.name) << 1);
}
};
}
int main() {
std::unordered_map<Key, int> map;
map[{1, "test"}] = 42;
}
Без этих определений std::unordered_map не сможет корректно хранить и искать элементы по ключам пользовательского типа.