std::set<Key,Compare,Allocator>::set
set(); explicit set( const Compare& comp, {{#pad:|12}} const Allocator& alloc = Allocator() ); |
||
explicit set( const Allocator& alloc ); |
(1) | (desde C++11) |
| (2) | ||
template< class InputIt > set( InputIt first, InputIt last, {{#pad:|3}} const Compare& comp = Compare(), {{#pad:|3}} const Allocator& alloc = Allocator() ); |
||
template< class InputIt > set( InputIt first, InputIt last, const Allocator& alloc) {{#pad:|3}} : set(first, last, Compare(), alloc) {} |
(desde C++14) | |
set( const set& other ); |
(3) | |
set( const set& other, const Allocator& alloc ); |
(3) | (desde C++11) |
set( set&& other ); |
(4) | (desde C++11) |
set( set&& other, const Allocator& alloc ); |
(4) | (desde C++11) |
| (5) | ||
set( std::initializer_list<value_type> init, {{#pad:|3}} const Compare& comp = Compare(), {{#pad:|3}} const Allocator& alloc = Allocator() ); |
(desde C++11) | |
set( std::initializer_list<value_type> init, const Allocator& alloc ) {{#pad:|3}} : set(init, Compare(), alloc) {} |
(desde C++14) | |
Construye un nuevo contenedor a partir de una variedad de fuentes de datos y opcionalmente usa un asignador de memoria alloc suplementado por el usuario o un objeto función de comparación comp.
[first, last). Si varios elementos en el rango tienen claves que se comparan equivalentes, no se especifica qué elemento se inserta (pendiente de la resolución de LWG2844).other.
|
Si no se proporciona |
(desde C++11) |
|
El parámetro de plantilla |
(desde C++23) |
other utilizando la semántica de movimiento. Si no se proporciona alloc, el asignador de memoria se obtiene mediante la construcción por movimiento del asignador que pertenece a other.
|
El parámetro de plantilla |
(desde C++23) |
init. Si varios elementos en el rango tienen claves que se comparan equivalentes, no se especifica qué elemento se inserta (pendiente de la resolución de LWG2844).Parámetros
| alloc | - | El asignador de memoria a usar para todas las asignaciones de memoria de este contenedor. |
| comp | - | El objeto función a usar para todas las comparaciones de las claves. |
| first, last | - | El rango del cual copiar los elementos. |
| other | - | El otro contenedor a usar como fuente para inicializar los elementos del contenedor. |
| init | - | La lista de inicializadores con la cual inicializar los elementos. |
| Requisitos de tipo | ||
-InputIt debe satisfacer los requisitos de InputIterator.
| ||
-Compare debe satisfacer los requisitos de Compare.
| ||
-Allocator debe satisfacer los requisitos de Allocator.
| ||
Complejidad
N = std::distance(first, last) en general, lineal en N si el rango ya está ordenado por value_comp().other.alloc y alloc != other.get_allocator(), entonces lineal.N = init.size() en general, lineal en N si la lista init ya está ordenada por value_comp().Excepciones
Las llamadas a Allocator::allocate pueden lanzar.
Notas
Después de la construcción por movimiento de un contenedor (la sobrecarga (4)), las referencias, punteros e iteradores (aparte del iterador al final) a other permanecen válidos, pero se refieren a los elementos que ahora se encuentran en *this. El estándar actual da esta garantía vía la generalización en [container.requirements.general]/12, y una garantía más directa está bajo consideración vía LWG 2321.
Aunque no se requiere formalmente hasta C++23, algunas implementaciones ya han puesto el parámetro de plantilla Allocator en contextos no deducidos en modalidades anteriores.
Ejemplo
#include <iostream>
#include <string>
#include <set>
#include <cmath>
struct Punto { double x, y; };
struct CompDePuntos { // comparador de puntos
bool operator()(const Punto& lhs, const Punto& rhs) const {
return std::hypot(lhs.x, lhs.y) < std::hypot(rhs.x, rhs.y);
}
};
int main()
{
// (1) Constructor por defecto
std::set<std::string> a;
a.insert("gato");
a.insert("perro");
a.insert("caballo");
for(auto& str: a) std::cout << str << ' ';
std::cout << '\n';
// (2) Constructor con iteradores
std::set<std::string> b(a.find("perro"), a.end());
for(auto& str: b) std::cout << str << ' ';
std::cout << '\n';
// (3) Constructor de copia
std::set<std::string> c(a);
c.insert("otro caballo");
for(auto& str: c) std::cout << str << ' ';
std::cout << '\n';
// (4) Constructor de movimiento
std::set<std::string> d(std::move(a));
for(auto& str: d) std::cout << str << ' ';
std::cout << '\n';
std::cout << "el set fuente de la operación de movimiento es ";
for(auto& str: a) std::cout << str << ' ';
std::cout << '\n';
// (5) Constructor por lista de inicializadores
std::set<std::string> e {"uno", "dos", "tres", "cinco", "ocho"};
for(auto& str: e) std::cout << str << ' ';
std::cout << '\n';
// Comparación personalizada
std::set<Punto, CompDePuntos> z = {{2, 5}, {3, 4}, {1, 1}};
z.insert({1, -1}); // esto falla porque la magnitud de 1,-1 es igual a 1,1
for(auto& p: z) std::cout << '(' << p.x << ',' << p.y << ") ";
std::cout << '\n';
}
Salida:
gato perro caballo
perro caballo
otro caballo gato perro caballo
gato perro caballo
el set fuente de la operación de movimiento es
ocho cinco one tres dos
(1,1) (3,4) (2,5)
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2193 | C++11 | El constructor por defecto es explicit.
|
Se hizo no explicit.
|
Véase también
| Asigna valores al contenedor. (función miembro pública) |