¿Cómo crear un mapa desordenado de tuplas en C++?

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;
}
Producción

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.

Publicación traducida automáticamente

Artículo escrito por bhuwanesh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *