std::unordered_set
es un contenedor asociativo que contiene un conjunto de objetos únicos de tipo
Key
. La búsqueda, inserción y eliminación tienen complejidad de tiempo promedio constante.
Internamente, los elementos no están ordenados en ningún orden particular, sino organizados en buckets. En qué bucket se coloca un elemento depende completamente del hash de su valor. Esto permite un acceso rápido a elementos individuales, ya que una vez que se calcula un hash, este se refiere al bucket exacto donde está colocado el elemento.
Los elementos del contenedor no pueden ser modificados (incluso por iteradores no constantes) ya que la modificación podría cambiar el hash de un elemento y corromper el contenedor.
Todas las funciones miembro de
std::unordered_set
son
constexpr
: es posible crear y utilizar objetos
std::unordered_set
en la evaluación de una expresión constante.
Sin embargo, los objetos
std::unordered_set
generalmente no pueden ser
constexpr
, porque cualquier almacenamiento asignado dinámicamente debe liberarse en la misma evaluación de la expresión constante.
Las funciones de intercambio no invalidan ninguno de los iteradores dentro del contenedor, pero sí invalidan el iterador que marca el final de la región de intercambio.
Las referencias y punteros a los datos almacenados en el contenedor solo se invalidan al borrar ese elemento, incluso cuando el iterador correspondiente queda invalidado.
Después de la asignación de movimiento de contenedor, a menos que la asignación de movimiento elemento por elemento sea forzada por asignadores incompatibles, las referencias, punteros e iteradores (excepto el iterador pasado el final) al contenedor movido permanecen válidos, pero refieren a elementos que ahora están en
*
this
.
Parámetros de plantilla
Esta sección está incompleta
Razón: Añadir descripciones de los parámetros de plantilla.
Tipos miembro
Tipo
Definición
key_type
Key
value_type
Key
size_type
tipo entero sin signo (generalmente std::size_t)
difference_type
tipo entero con signo (generalmente std::ptrdiff_t)
un tipo iterador cuyas categoría, valor, diferencia, puntero y tipos de referencia son los mismos que iterator. Este iterador puede usarse para iterar a través de un solo cubo pero no entre cubos
const_local_iterator
un tipo iterador cuyas categoría, valor, diferencia, puntero y tipos de referencia son los mismos que const_iterator. Este iterador puede usarse para iterar a través de un solo cubo pero no entre cubos
node_type(desde C++17)
una especialización de node handle que representa un nodo contenedor
insert_return_type(desde C++17)
tipo que describe el resultado de insertar un node_type, una especialización de
Los tipos miembro
iterator
y
const_iterator
pueden ser alias del mismo tipo. Esto significa que definir un par de sobrecargas de función usando los dos tipos como tipos de parámetro puede violar la
One Definition Rule
. Dado que
iterator
es convertible a
const_iterator
, una única función con un
const_iterator
como tipo de parámetro funcionará en su lugar.
#include <iostream>#include <unordered_set>void print(constauto& set){for(constauto& elem : set)std::cout<< elem <<' ';std::cout<<'\n';}int main(){
std::unordered_set<int> mySet{2, 7, 1, 8, 2, 8};// crea un set de ints
print(mySet);
mySet.insert(5);// inserta un elemento 5 en el set
print(mySet);if(auto iter = mySet.find(5); iter != mySet.end())
mySet.erase(iter);// elimina un elemento apuntado por iter
print(mySet);
mySet.erase(7);// elimina un elemento 7
print(mySet);}
Salida posible:
8 1 7 2
5 8 1 7 2
8 1 7 2
8 1 2
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.