conjunto desordenado de tuplas en C++ con ejemplos

¿Qué es una tupla?

Una tupla en C++ es un objeto que se utiliza para agrupar elementos. En una tupla, los elementos pueden ser del mismo tipo de datos o diferentes tipos de datos. Los elementos de las tuplas se inicializan en el orden en que se accederá a ellos. 

Funciones asociadas a una tupla:

1. make_tuple(): make_tuple() se usa para asignar tupla con valores. Los valores pasados ​​deben estar en orden con los valores declarados en la tupla.
2. get(): get() se utiliza para acceder a los valores de la tupla y modificarlos, acepta el índice y el nombre de la tupla como argumentos para acceder a un elemento de la tupla en particular.

¿Qué es un conjunto desordenado?

Un conjunto desordenado es un contenedor asociativo desordenado que es similar a un conjunto, pero en el caso de un conjunto desordenado, los elementos no se organizan en ningún orden en particular. Al igual que un conjunto, un conjunto desordenado también contiene elementos únicos. Un conjunto no ordenado se implementa utilizando una tabla hash internamente y las claves se convierten en índices de la tabla hash. La inserción en un conjunto desordenado siempre es impredecible o aleatoria. La mayoría de las operaciones en un conjunto desordenado toman un tiempo constante O(1), pero en el peor de los casos, la complejidad del tiempo puede llegar a O(n). 

Funciones asociadas al conjunto desordenado:  

  • insert(x) :Inserta un nuevo elemento ‘x’ en el contenedor del conjunto desordenado.
  • begin() : Devuelve un iterador que apunta al primer elemento en el contenedor unordered_set.
  • end() : Devuelve un iterador que apunta al elemento hipotético al lado del elemento final.
  • count() : cuenta el número de veces que un elemento en particular está presente en un contenedor unordered_set.
  • erase() : elimine un solo elemento o un rango de elementos que van desde el principio hasta el final (exclusivo).
  • size() : Devuelve el número de elementos en el contenedor unordered_set.
  • swap() : Intercambia valores de dos contenedores unordered_set.
  • max_size() : Devuelve el número máximo de elementos que puede contener un contenedor unordered_set.
  • vacío() : comprueba si un contenedor unordered_set está vacío o no.

Un conjunto desordenado de tuplas puede ser bastante útil siempre que un algoritmo requiera una estructura de datos compleja. 

Este artículo se centra en cómo crear un conjunto desordenado de tuplas en C++. Tenga en cuenta que, por simplicidad, estamos considerando una tupla de tres elementos, pero una tupla también puede contener más o menos elementos.

Conjunto desordenado de tuplas

Un conjunto desordenado de tuplas es un conjunto desordenado en el que cada uno de los elementos es una tupla. Tenga en cuenta que, de forma predeterminada, un conjunto desordenado no tiene la funcionalidad de las tuplas. En palabras simples, no se puede declarar un conjunto desordenado de tuplas directamente en C++. Uno tiene que pasar una función Hash como argumento al conjunto desordenado. 

Sintaxis:

unordered_set<tuple<dataType1, dataType2, dataType3>, hashFunction> unorderedSetOfTuples;

Aquí,

dataType1, dataType2, dataType3 son tipos de datos similares o diferentes

función hash:

struct hashFunction
{
    size_t operator()(const tuple<int , int , int>&x) const
   {
       return get<0>(x) ^ get<1>(x) ^ get<2>(x);
   }
};

Ejemplo 1: a continuación se muestra la implementación utilizando un conjunto desordenado de tuplas.

C++

// C++ program to illustrate the
// implementation of unorderedSet of
// tuples
#include <bits/stdc++.h>
using namespace std;
  
// Hash function
struct hashFunction
{
  size_t operator()(const tuple<int , 
                    int , int>&x) const
  {
    return get<0>(x) ^ get<1>(x) ^ get<2>(x);
  }
};
  
// Function to print unordered set elements
void print(unordered_set<tuple<int, int,
           int>, hashFunction > &unorderedSetOfTuples)
{ 
  // Iterating over unorderedSetOfTuples elements
  for (auto currentTuple : unorderedSetOfTuples)
  {
    // Each element is a tuple itself
    tuple<int, int, int> tp = currentTuple;
  
    cout << "[ ";
  
    // Printing tuple elements
    cout << get<0>(tp) <<
      " , " << get<1>(tp) <<
      " , " << get<2>(tp) ;
    cout << " ]";
  
    cout << "\n";
  }
  
}
  
// Driver code
int main()
{
  // Declaring a unordered set of tuples
  unordered_set<tuple<int, int,
  int>, hashFunction > unorderedSetOfTuples;
  
  // Initializing tuples of int type
  tuple<int, int,
        int> tuple1;
  tuple1 = make_tuple(4, 2, 3);
  
  tuple<int, int,
        int> tuple2;
  tuple2 = make_tuple(2, 3, 5);
  
  tuple<int, int,
        int> tuple3;
  tuple3 = make_tuple(2, 3, 5);
  
  tuple<int, int,
        int> tuple4;
  tuple4 = make_tuple(2, 1, 4);
  
  tuple<int, int,
        int> tuple5;
  tuple5 = make_tuple(4, 2, 3);
  
  
  // Inserting into unordered set
  unorderedSetOfTuples.insert(tuple1);
  unorderedSetOfTuples.insert(tuple2);
  unorderedSetOfTuples.insert(tuple3);
  unorderedSetOfTuples.insert(tuple4);
  unorderedSetOfTuples.insert(tuple5);
  
  // Calling print function
  print(unorderedSetOfTuples);
  return 0;
}

Producción:

[ 2 , 1 , 4 ]
[ 4 , 2 , 3 ]
[ 2 , 3 , 5 ]

Explicación:

En el resultado anterior, los elementos o tuplas no están dispuestos en ningún orden en particular.

Ejemplo 2: a continuación se muestra la implementación utilizando un conjunto desordenado de tuplas.

C++

// C++ program to illustrate the
// implementation of unordered set of
// tuples
#include <bits/stdc++.h>
using namespace std;
   
// Hash function
struct hashFunction
{
  size_t operator()(const tuple<bool, 
                    bool, bool>&x) const
  {
    return get<0>(x) ^ std::get<1>(x) ^ std::get<2>(x);
  }
};
  
// Function to print unorderedSet elements
void print(unordered_set<tuple<bool, bool,
           bool>, hashFunction > &unorderedSetOfTuples)
{
  // Iterating over unorderedSetOfTuples elements
  for (auto currentTuple : unorderedSetOfTuples)
  {
    // Each element is a tuple itself of 
    // bool type
    tuple<bool, bool, bool> tp = currentTuple;
  
    cout << "[ ";
  
    // Printing tuple elements
    cout << get<0>(tp) <<
            " , " << get<1>(tp) <<
            " , " << get<2>(tp) ;
    cout << " ]";
  
    cout << "\n";
  }
  
}
  
// Driver code
int main()
{
  // Declaring a unordered set of tuples
  unordered_set<tuple<bool, bool,
  bool>, hashFunction > unorderedSetOfTuples;
  
  // Initializing tuples of bool type
  tuple<bool, bool,
        bool> tuple1;
  tuple1 = make_tuple(0, 1, 1);
  
  tuple<bool, bool,
        bool> tuple2;
  tuple2 = make_tuple(1, 1, 1);
  
  tuple<bool, bool,
        bool> tuple3;
  tuple3 = make_tuple(0, 1, 1);
  
  tuple<bool, bool,
        bool> tuple4;
  tuple4 = make_tuple(0, 0, 0);
  
  tuple<bool, bool,
        bool> tuple5;
  tuple5 = make_tuple(1, 1, 0);
  
  tuple<bool, bool,
        bool> tuple6;
  tuple6 = make_tuple(0, 1, 1);
  
  // Inserting into the unordered set
  unorderedSetOfTuples.insert(tuple1);
  unorderedSetOfTuples.insert(tuple2);
  unorderedSetOfTuples.insert(tuple3);
  unorderedSetOfTuples.insert(tuple4);
  unorderedSetOfTuples.insert(tuple5);
  unorderedSetOfTuples.insert(tuple6);
  
  // Calling print function
  print(unorderedSetOfTuples);
  return 0;
}

Producción:

[ 1 , 1 , 0 ]
[ 0 , 0 , 0 ]
[ 0 , 1 , 1 ]
[ 1 , 1 , 1 ]

Explicación:

En el resultado anterior, los elementos no están dispuestos en ningún orden en particular. Esto confirma que, en un conjunto desordenado, las claves se codifican en los índices de la tabla hash de forma aleatoria. Además, tuple3 y tuple6 tienen el mismo conjunto de valores booleanos, por eso solo una copia de la tupla está presente en el conjunto. 

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 *