std:: unordered_set
|
Definido en el encabezado
<unordered_set>
|
||
|
template
<
class
Key,
|
(1) | (desde C++11) |
|
namespace
pmr
{
template
<
|
(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
|
(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
|
Esta sección está incompleta
Razón: Añadir descripciones de los 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
>
|
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) |
|
|
(C++23)
|
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) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++20)
|
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
|
(C++11)
|
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) |