¿Cómo crear un conjunto desordenado de clases o estructuras definidas por el usuario en C++?

Unordered_set implementa internamente una tabla hash para almacenar elementos. De manera predeterminada, solo podemos almacenar el tipo predefinido como int, string, float, etc. 
Si queremos almacenar el elemento del tipo definido por el usuario como estructura, el compilador mostrará un error porque antes de almacenar elementos en unordered_set, el compilador realiza algunas comprobaciones. Y al comparar dos compiladores de tipos definidos por el usuario, no puede compararlos, por lo que genera un error. 
Entonces, para almacenar una estructura en un conjunto_desordenado, es necesario diseñar alguna función de comparación. Dado que unordered_set también store implementa la tabla hash para almacenar elementos, también deberíamos implementar la función hash para realizar el trabajo relacionado con el hash. 
El siguiente método explica su implementación. 
Implementación:Creamos un tipo de estructura y definimos una función de comparación dentro de esa estructura que se usará para comparar dos objetos de tipo de estructura. Dado que unordered_set implementa internamente la función hash, también deberíamos implementar la función hash para objetos de tipo definido por el usuario. 
Sintaxis Para almacenar elementos de tipo definidos por el usuario unordered_set debe seguir la siguiente sintaxis 
 

unordered_set(elementType, MyHashType) us;
// element type is user defined type and MyHashType is class implementing hash function

El siguiente código lo explica. 
 

CPP

// CPP implementation to use
// user-defined data type in
// structures
#include <bits/stdc++.h>
using namespace std;
 
// Structure definition
struct Test {
 
    int id;
 
    // This function is used by unordered_set to compare
    // elements of Test.
    bool operator==(const Test& t) const
    {
        return (this->id == t.id);
    }
};
 
// class for hash function
class MyHashFunction {
public:
    // id is returned as hash function
    size_t operator()(const Test& t) const
    {
        return t.id;
    }
};
 
// Driver method
int main()
{
    // put values in each
    // structure define below.
    Test t1 = { 110 }, t2 = { 102 },
         t3 = { 101 }, t4 = { 115 };
 
    // define a unordered_set having
    // structure as its elements.
    unordered_set<Test, MyHashFunction> us;
 
    // insert structure in unordered_set
    us.insert(t1);
    us.insert(t2);
    us.insert(t3);
    us.insert(t4);
 
    // printing the elements of unordered_set
    for (auto e : us) {
        cout << e.id << " ";
    }
 
    return 0;
}
Producción: 

115 101 110 102

 

Producción: 

115 101 110 102

 

A continuación se muestra otro ejemplo en el que usamos funciones hash predefinidas para hacer una función hash general de nuestra clase definida.
 

CPP

// CPP program to demonstrate working of unordered_set
// 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 predefined 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_set<Person, MyHashFunction> us;
    Person p1("kartik", "kapoor");
    Person p2("Ram", "Singh");
    Person p3("Laxman", "Prasad");
 
    us.insert(p1);
    us.insert(p2);
    us.insert(p3);
 
    for (auto e : us) {
        cout << "[" << e.first << ", "
             << e.last << "]\n";
    }
 
    return 0;
}
Producción: 

[Laxman, Prasad]
[kartik, kapoor]
[Ram, Singh]

 

Publicación traducida automáticamente

Artículo escrito por ankit15697 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 *