¿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.