std:: set
|
Definido en el encabezado
<set>
|
||
|
template
<
class
Key,
|
(1) | |
|
namespace
pmr
{
template
<
|
(2) | (desde C++17) |
std::set
es un contenedor asociativo que contiene un conjunto ordenado de objetos únicos de tipo
Key
. La ordenación se realiza utilizando la función de comparación de claves
Compare
. Las operaciones de búsqueda, eliminación e inserción tienen complejidad logarítmica. Los conjuntos generalmente se implementan como
Red–black trees
.
En todas partes donde la biblioteca estándar utiliza los Compare requisitos, la unicidad se determina utilizando la relación de equivalencia. En términos imprecisos, dos objetos a y b se consideran equivalentes si ninguno se compara menor que el otro: ! comp ( a, b ) && ! comp ( b, a ) .
std::set
cumple con los requisitos de
Container
,
AllocatorAwareContainer
,
AssociativeContainer
y
ReversibleContainer
.
Todas las funciones miembro de
std::set
son
constexpr
: es posible crear y utilizar objetos
std::set
en la evaluación de una expresión constante.
Sin embargo, los objetos
|
(since C++26) |
Contenidos |
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 ) | ||||
key_compare
|
Compare
|
||||
value_compare
|
Compare
|
||||
allocator_type
|
Allocator
|
||||
reference
|
value_type & | ||||
const_reference
|
const value_type & | ||||
pointer
|
|
||||
const_pointer
|
|
||||
iterator
|
Iterador bidireccional constante
LegacyBidirectionalIterator
e
ConstexprIterator
(desde C++26)
a
value_type
|
||||
const_iterator
|
LegacyBidirectionalIterator e ConstexprIterator (desde C++26) a const value_type | ||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > | ||||
node_type
(desde C++17)
|
una especialización de manejador de nodo 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
set
(función miembro pública) |
|
destruye el
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 |
|
|
(C++11)
|
devuelve un iterador al inicio
(función miembro pública) |
|
(C++11)
|
devuelve un iterador al final
(función miembro pública) |
|
(C++11)
|
devuelve un iterador inverso al principio
(función miembro pública) |
|
(C++11)
|
devuelve un iterador inverso 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) |
|
(C++11)
|
construye el elemento in situ
(función miembro pública) |
|
(C++11)
|
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) |
|
|
devuelve un iterador al primer elemento
no menor
que la clave dada
(función miembro pública) |
|
|
devuelve un iterador al primer elemento
mayor
que la clave dada
(función miembro pública) |
|
Observadores |
|
|
devuelve la función que compara claves
(función miembro pública) |
|
devuelve la función que compara claves en objetos de tipo
value_type
(función miembro pública) |
|
Funciones no miembro
|
(eliminado en C++20)
(eliminado en C++20)
(eliminado en C++20)
(eliminado en C++20)
(eliminado en C++20)
(C++20)
|
compara lexicográficamente los valores de dos
set
s
(plantilla de función) |
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
(C++20)
|
elimina 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_set
|
202502L
|
(C++26) |
constexpr
std::set
|
Ejemplo
#include <algorithm> #include <iomanip> #include <iostream> #include <iterator> #include <set> #include <string_view> template<typename T> std::ostream& operator<<(std::ostream& out, const std::set<T>& set) { if (set.empty()) return out << "{}"; out << "{ " << *set.begin(); std::for_each(std::next(set.begin()), set.end(), [&out](const T& element) { out << ", " << element; }); return out << " }"; } int main() { std::set<int> set{1, 5, 3}; std::cout << set << '\n'; set.insert(2); std::cout << set << '\n'; set.erase(1); std::cout << set << "\n\n"; std::set<int> keys{3, 4}; for (int key : keys) { if (set.contains(key)) std::cout << set << " does contain " << key << '\n'; else std::cout << set << " doesn't contain " << key << '\n'; } std::cout << '\n'; std::string_view word = "element"; std::set<char> characters(word.begin(), word.end()); std::cout << "There are " << characters.size() << " unique characters in " << std::quoted(word) << ":\n" << characters << '\n'; }
Salida:
{ 1, 3, 5 }
{ 1, 2, 3, 5 }
{ 2, 3, 5 }
{ 2, 3, 5 } does contain 3
{ 2, 3, 5 } doesn't contain 4
There are 5 unique characters in "element":
{ e, l, m, n, t }
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 103 | C++98 | el iterador permitía modificar claves | el iterador se hizo constante |
| LWG 230 | C++98 |
Key
no requería ser
CopyConstructible
(una clave de tipo
Key
podría no poder construirse)
|
Key
también requiere
ser CopyConstructible |
Véase también
|
colección de claves, ordenadas por claves
(plantilla de clase) |
|
|
(C++11)
|
colección de claves únicas, distribuidas mediante hash por claves
(plantilla de clase) |
|
(C++23)
|
adapta un contenedor para proporcionar una colección de claves únicas, ordenadas por claves
(plantilla de clase) |