Как создать unordered_map пользовательского класса в C ++?

Опубликовано: 30 Декабря, 2021

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
Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .