Namespaces
Variants

std:: unordered_set

From cppreference.net
Definido en el encabezado <unordered_set>
template <

class Key,
class Hash = std:: hash < Key > ,
class KeyEqual = std:: equal_to < Key > ,
class Allocator = std:: allocator < Key >

> class unordered_set ;
(1) (desde C++11)
namespace pmr {

template <
class Key,
class Hash = std:: hash < Key > ,
class Pred = std:: equal_to < Key >
> using unordered_set = std :: unordered_set < Key, Hash, Pred,
std:: pmr :: polymorphic_allocator < Key >> ;

}
(2) (desde C++17)

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.

std::unordered_set cumple con los requisitos de Container , AllocatorAwareContainer , UnorderedAssociativeContainer .

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.

(since C++26)

Contenidos

Invalidación de iteradores

Operaciones Invalidados
Todas las operaciones de solo lectura, swap , std::swap Nunca
clear , rehash , reserve , operator= Siempre
insert , emplace , emplace_hint Solo si causa rehash
erase Solo al elemento eliminado

Notas

  • 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

Tipos de miembros

Tipo Definición
key_type Key
value_type Key
size_type Tipo entero sin signo (normalmente std::size_t )
difference_type Tipo entero con signo (normalmente std::ptrdiff_t )
hasher Hash
key_equal KeyEqual
allocator_type Allocator
reference value_type &
const_reference const value_type &
pointer std:: allocator_traits < Allocator > :: pointer
const_pointer std:: allocator_traits < Allocator > :: const_pointer
iterator Iterador constante LegacyForwardIterator y ConstexprIterator (desde C++26) a value_type
const_iterator LegacyForwardIterator y ConstexprIterator (desde C++26) a const value_type
local_iterator Un tipo de iterador cuya 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 de iterador cuya 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 del contenedor
insert_return_type (desde C++17) tipo que describe el resultado de insertar un node_type , una especialización de

template < class Iter, class NodeType >
struct /*unspecified*/
{
Iter     position ;
bool inserted ;
NodeType node ;
} ;

instanciado con argumentos de plantilla iterator y node_type .

Funciones miembro

construye el unordered_set
(función miembro pública)
destruye el unordered_set
(función miembro pública)
asigna valores al contenedor
(función miembro pública)
devuelve el asignador asociado
(función miembro pública)
Iteradores
devuelve un iterador al inicio
(función miembro pública)
devuelve un iterador al final
(función miembro pública)
Capacidad
comprueba si el contenedor está vacío
(función miembro pública)
devuelve el número de elementos
(función miembro pública)
devuelve el número máximo posible de elementos
(función miembro pública)
Modificadores
borra el contenido
(función miembro pública)
inserta elementos o nodos (desde C++17)
(función miembro pública)
inserta un rango de elementos
(función miembro pública)
construye el elemento in situ
(función miembro pública)
construye elementos in-situ usando una pista
(función miembro pública)
elimina elementos
(función miembro pública)
intercambia los contenidos
(función miembro pública)
(C++17)
extrae nodos del contenedor
(función miembro pública)
(C++17)
empalma nodos de otro contenedor
(función miembro pública)
Lookup
devuelve el número de elementos que coinciden con una clave específica
(función miembro pública)
encuentra elemento con clave específica
(función miembro pública)
(C++20)
comprueba si el contenedor contiene un elemento con una clave específica
(función miembro pública)
devuelve el rango de elementos que coinciden con una clave específica
(función miembro pública)
Interfaz de Bucket
devuelve un iterador al inicio del bucket especificado
(función miembro pública)
devuelve un iterador al final del bucket especificado
(función miembro pública)
devuelve el número de buckets
(función miembro pública)
devuelve el número máximo de buckets
(función miembro pública)
devuelve el número de elementos en un bucket específico
(función miembro pública)
devuelve el cubo para una clave específica
(función miembro pública)
Política de hash
devuelve el número promedio de elementos por bucket
(función miembro pública)
gestiona el número máximo promedio de elementos por bucket
(función miembro pública)
reserva al menos el número especificado de buckets y regenera la tabla hash
(función miembro pública)
reserva espacio para al menos el número especificado de elementos y regenera la tabla hash
(función miembro pública)
Observadores
devuelve la función utilizada para hashear las claves
(función miembro pública)
devuelve la función utilizada para comparar claves por igualdad
(función miembro pública)

Funciones no miembro

(C++11) (C++11) (removed in C++20)
compara los valores en el unordered_set
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
borra todos los elementos que cumplen criterios específicos
(plantilla de función)

Guías de deducción

(desde C++17)

Notas

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.

Macro de prueba de características Valor Estándar Característica
__cpp_lib_containers_ranges 202202L (C++23) Construcción e inserción de rangos para contenedores
__cpp_lib_constexpr_unordered_set 202502L (C++26) constexpr std::unordered_set

Ejemplo

#include <iostream>
#include <unordered_set>
void print(const auto& set)
{
    for (const auto& 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.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2050 C++11 las definiciones de reference , const_reference , pointer
y const_pointer se basaban en allocator_type
basadas en value_type y
std::allocator_traits

Véase también

colección de claves, hasheadas por claves
(plantilla de clase)
colección de claves únicas, ordenadas por claves
(plantilla de clase)
(C++23)
adapta un contenedor para proporcionar una colección de claves únicas, ordenadas por claves
(plantilla de clase)