Как создать unordered_map пользовательского класса в C ++?
unordered_map используется для реализации хеш-таблиц. Он хранит пары ключ-значение. Для каждого ключа вычисляется хеш-функция, и значение сохраняется в этой хеш-записи. Хеш-функции для стандартных типов данных (int, char, string, ..) предопределены. Как использовать наши собственные типы данных для реализации хеш-таблиц?
unordered_map позволяет использовать третий параметр, который используется для указания нашей собственной хеш-функции.
// Создаем unordered_map с заданным KeyType, // ValueType и хеш-функция, определяемая // MyHashType unordered_map <KeyType, ValueType, MyHashType> мм;
Здесь MyHashFunction - это класс или структура, которые должны содержать оператор function () .
Мы также должны реализовать оператор == в нашем собственном классе, который используется для обработки коллизий.
Ниже приведен пример кода, в котором в качестве ключей используются объекты класса Person. Мы определяем нашу собственную хеш-функцию, которая использует сумму длин имени и фамилии в качестве ключа в хеш-таблице. Обратите внимание, что цель этого кода - только продемонстрировать работу с простым кодом, и сумма длин может быть не очень хорошей идеей в качестве хеш-функции.
Другой пример, где предопределенные операторные функции предопределенного хеш-класса делают наш общий хэш.
// CPP program to demonstrate working of unordered_map // for user defined data types. #include <bits/stdc++.h> using namespace std; struct Person { string first, last; Person(string f, string l) { first = f; last = l; } bool operator==( const Person& p) const { return first == p.first && last == p.last; } }; class MyHashFunction { public : // We use predfined hash functions of strings // and define our hash function as XOR of the // hash values. size_t operator()( const Person& p) const { return (hash<string>()(p.first)) ^ (hash<string>()(p.last)); } }; // Driver code int main() { unordered_map<Person, int , MyHashFunction> um; Person p1( "kartik" , "kapoor" ); Person p2( "Ram" , "Singh" ); Person p3( "Laxman" , "Prasad" ); um[p1] = 100; um[p2] = 200; um[p3] = 100; for ( auto e : um) { cout << "[" << e.first.first << ", " << e.first.last << "] = > " << e.second << '
' ; } return 0; } |
[Лаксман, Прасад] => 100 [картик, капур] => 100 [Рам, Сингх] => 200