Tupla : una tupla es un objeto que puede contener varios elementos. Los elementos pueden ser de diferentes tipos de datos. Los elementos de las tuplas se inicializan como argumentos en el orden en que se accederá a ellos.
Unordered Map no contiene una función hash para una tupla. Entonces, si queremos hacer un hash de una tupla, entonces tenemos que proporcionarle explícitamente una función hash que pueda hacer un hash de una tupla.
unordered_map puede tomar hasta 5 argumentos:
- Clave : Tipo de valores clave.
- Valor : tipo de valor que se almacenará en 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 utiliza 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.
Sintaxis:
mapa_desordenado<tuple<tipo_datos, tipo_datos, tipo_datos>, tipo_datos, función_hash> map_of_tuple;
C++
// CPP program to demonstrate implementation // of unordered_map for a tuple. #include <bits/stdc++.h> using namespace std; // A hash function used to hash a tuple struct hash_tuple { template <class T1, class T2, class T3> size_t operator()( const tuple<T1, T2, T3>& x) const { return get<0>(x) ^ get<1>(x) ^ get<2>(x); } }; int main() { // Sending the hash function // as a third argument unordered_map<tuple<int, int, int>, bool, hash_tuple> mapOfTuple; // Creating some tuples to be used as keys tuple<int, int, int> t1(100, 200, 300); tuple<int, int, int> t2(400, 500, 600); tuple<int, int, int> t3(700, 800, 900); // Inserting values // in the unordered_map mapOfTuple[t1] = true; mapOfTuple[t2] = false; mapOfTuple[t3] = true; cout << "Contents of the unordered_map: \n"; for (auto p : mapOfTuple) cout << "[" << get<0>(p.first) << ", " << get<1>(p.first) << ", " << get<2>(p.first) << "] ==> " << p.second << "\n"; return 0; }
Contents of the unordered_map: [700, 800, 900] ==> 1 [100, 200, 300] ==> 1 [400, 500, 600] ==> 0
Nota: No es necesario pasar una función hash en el mapa, que es un BST autoequilibrado. En otras palabras, map<tuple<data_type, data_type, data_type>, data_type> mp funciona bien.