Unordered Map no contiene una función hash para un par como la que tiene para int, string, etc. Por lo tanto, si queremos codificar un par, debemos proporcionarle explícitamente una función hash que pueda codificar un par. unordered_map puede tomar hasta 5 argumentos:
- Clave : Tipo de valores clave
- Valor: tipo de valor que se almacenará contra la clave
- Función hash: una función que se utiliza para codificar la clave dada. Si no se proporciona, utiliza la función hash predeterminada.
- Pred: una función que se usa para que dos claves no puedan tener los mismos valores hash
- Alloc: un objeto utilizado para definir el modelo de memoria para el mapa
hash_function puede ser cualquier cosa, dado que puede codificar la clave dada.
Requisito previo: ¿Cómo crear un mapa unordered_map de clase definida por el usuario?
CPP
// 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); if (hash1 != hash2) { return hash1 ^ hash2; } // If hash1 == hash2, their XOR is zero. return hash1; } }; 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(3005, 3005); pair<int, int> p4(4000, 4000); // Inserting values in the unordered_map. um[p1] = true; um[p2] = false; um[p3] = true; um[p4] = false; cout << "Contents of the unordered_map : \n"; for (auto p : um) cout << "[" << (p.first).first << ", " << (p.first).second << "] ==> " << p.second << "\n"; return 0; }
Contents of the unordered_map : [4000, 4000] ==> 0 [3005, 3005] ==> 1 [1000, 2000] ==> 1 [2000, 3000] ==> 0
Nota: podemos crear un mapa para un par. Echa un vistazo al mapa de la pareja . La razón es que el mapa se basa en BST de autoequilibrio y no requiere una función hash.
Problema de ejercicio: Nikhil es un vendedor ambulante y hoy está visitando casas en una nueva localidad para vender enciclopedias. La nueva ciudad está en el inicio de una cuadrícula de x*y(1<=x<=10^9, 1<=y<=10^9) y en cada intersección hay una casa. Ahora no es muy bueno recordando las casas que ya ha visitado, así que cada vez que entra en una casa te dice la coordenada de la casa. Tu trabajo es recordar la coordenada y al final del día decirle todas las casas que visitó ese día.
Ejemplos:
Ingrese:
Ingrese el número de casas que visitó hoy: 5
Ingrese la coordenada de HouseNo. 1 :1000 12985
Introduzca la coordenada de HouseNo. 2 :12548 25621
Introduzca la coordenada de HouseNo. 3 :14586 26481
Introduzca la coordenada de HouseNo. 4 :12 63
Introduzca la coordenada de HouseNo. 5 :14689 36945
Salida :
Casas que visitó hoy:
12 63
14689 36945
14586 26481
1000 12985 12548
25621