Как создать unordered_map пар в C ++?

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

Неупорядоченная карта не содержит хэш-функции для пары, как для int, string и т. Д., Поэтому, если мы хотим хешировать пару, мы должны явно предоставить ей хеш-функцию, которая может хешировать пару. unordered_map может принимать до 5 аргументов:

  • Ключ: тип пары "ключ-значение"
  • Значение: тип значения, которое будет сохранено для ключа.
  • Хеш-функция: функция, которая используется для хеширования данного ключа. Если не указано иное, используется хеш-функция по умолчанию.
  • Pred: функция, которая используется для того, чтобы никакие два ключа не могли иметь одинаковые хэш-значения.
  • Распределить: объект, используемый для определения модели памяти для карты.

hash_function может быть любым, учитывая, что он может хешировать данный ключ.

Предпосылка: как создать unordered_map определенного пользователем класса?

// CPP program to demonstrate implementation of
// unordered_map for a pair.
#include <bits/stdc++.h>
using namespace std;
// A hash function used to hash a pair of any kind
struct hash_pair {
template < class T1, class T2>
size_t operator()( const pair<T1, T2>& p) const
{
auto hash1 = hash<T1>{}(p.first);
auto hash2 = hash<T2>{}(p.second);
return hash1 ^ hash2;
}
};
int main()
{
// Sending the hash function as a third argument
unordered_map<pair< int , int >, bool , hash_pair> um;
// Creating some pairs to be used as keys
pair< int , int > p1(1000, 2000);
pair< int , int > p2(2000, 3000);
pair< int , int > p3(2005, 3005);
// Inserting values in the unordered_map.
um[p1] = true ;
um[p2] = false ;
um[p3] = true ;
cout << "Contents of the unordered_map : " ;
for ( auto p : um)
cout << "[" << (p.first).first << ", "
<< (p.first).second << "] ==> "
<< p.second << " " ;
return 0;
}
Выход:
Содержимое unordered_map: 
[1000, 2000] ==> 1
[2005, 3005] ==> 1
[2000, 3000] ==> 0

Примечание: мы можем создать карту для пары. Посмотрите карту пары. Причина в том, что карта основана на самобалансирующихся BST и не требует хэш-функции.

Задача упражнения: Нихил - коммивояжер, и сегодня он посещает дома в новом районе, чтобы продавать энциклопедии. Новый город находится в начале сетки x * y (1 <= x <= 10 ^ 9, 1 <= y <= 10 ^ 9), и на каждом перекрестке есть дом. Теперь он не очень хорошо запоминает дома, которые он уже посетил, поэтому всякий раз, когда он входит в дом, он сообщает вам координаты дома. Ваша задача - запомнить координаты и в конце дня рассказать ему обо всех домах, которые он посетил в тот день.

Примеры:

Input :
Enter the number of houses that he visited today :5
Enter the coordinate of HouseNo. 1 :1000 12985
Enter the coordinate of HouseNo. 2 :12548 25621
Enter the coordinate of HouseNo. 3 :14586 26481
Enter the coordinate of HouseNo. 4 :12 63
Enter the coordinate of HouseNo. 5 :14689 36945
Output :
Houses that he visited today:
12 63
14689 36945
14586 26481
1000 12985
12548 25621

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