Namespaces
Variants

std:: set

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

class Key,
class Compare = std:: less < Key > ,
class Allocator = std:: allocator < Key >

> class set ;
(1)
namespace pmr {

template <
class Key,
class Compare = std:: less < Key >
> using set = std :: set < Key, Compare, std:: pmr :: polymorphic_allocator < Key >> ;

}
(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 std::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

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

Allocator::pointer

(hasta C++11)

std:: allocator_traits < Allocator > :: pointer

(desde C++11)
const_pointer

Allocator::const_pointer

(hasta C++11)

std:: allocator_traits < Allocator > :: const_pointer

(desde C++11)
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 >
struct /*no especificado*/
{
Iter     posición ;
bool insertado ;
NodeType nodo ;
} ;

instanciado con los argumentos de plantilla iterator y node_type .

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
devuelve un iterador al inicio
(función miembro pública)
(C++11)
devuelve un iterador al final
(función miembro pública)
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)
inserta un rango de elementos
(función miembro pública)
(C++11)
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)
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)
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)
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)