Espacios de nombres
Variantes

std::multiset<Key,Compare,Allocator>::multiset

De cppreference.com
 
 
 
 
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
multiset(); explicit multiset( const Compare& comp, {{#pad:|17}} const Allocator& alloc = Allocator() );
(1)
explicit multiset( const Allocator& alloc );
(1) (desde C++11)
(2)
template< class InputIt > multiset( InputIt first, InputIt last, {{#pad:|8}} const Compare& comp = Compare(), {{#pad:|8}} const Allocator& alloc = Allocator() );
template< class InputIt > multiset( InputIt first, InputIt last, {{#pad:|8}} const Allocator& alloc );
(desde C++14)
multiset( const multiset& other );
(3)
multiset( const multiset& other, const Allocator& alloc );
(3) (desde C++11)
multiset( multiset&& other );
(4) (desde C++11)
multiset( multiset&& other, const Allocator& alloc );
(4) (desde C++11)
(5)
multiset( std::initializer_list<value_type> init, {{#pad:|8}} const Compare& comp = Compare(), {{#pad:|8}} const Allocator& alloc = Allocator() );
(desde C++11)
multiset( std::initializer_list<value_type> init, {{#pad:|8}} const Allocator& );
(desde C++14)

Construye un nuevo contenedor a partir de una variedad de fuentes de datos y, opcionalmente, utiliza el asignador de memoria alloc proporcionado por el usuario o el objeto función de comparación comp.

1) Construye un contenedor vacío.
2) Construye el contenedor con el contenido del rango [first, last).
3) Constructor de copia. Construye el contenedor con la copia del contenido de other.

Si alloc no se proporciona, el asignador se obtiene llamando a std::allocator_traits<allocator_type>::select_on_container_copy_construction( other.get_allocator()).

(desde C++11)

El parámetro de plantilla Allocator solo se deduce del primer argumento mientras se usa en la deducción de argumentos de plantillas de clase.

(desde C++23)
4) Constructor de movimiento. Construye el contenedor con el contenido de other utilizando la semántica de movimiento. Si alloc no se proporciona, el asignador se obtiene mediante la construcción por movimiento a partir del asignador que pertenece a other.

El parámetro de plantilla Allocator solo se deduce del primer argumento mientras se usa en la deducción de argumentos de plantillas de clase.

(desde C++23)
5) Construye el contenedor con el contenido de la lista de inicializadores init.

Parámetros

alloc - El asignador a usar para todas las asignaciones de memoria de este contenedor.
comp - El objeto función de comparación a usar para todas las comparaciones de claves.
first, last - El rango del cual copiar los elementos.
other - Otro contenedor a usar como fuente con el cual inicializar los elementos del contenedor.
init - La lista de inicializadores con la cual inicializar los elementos del contenedor.
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

1) Constante.
2) N log(N) donde N = std::distance(first, last) por lo general, lineal en N si el rango ya está ordenado por value_comp().
3) Lineal en el tamaño de other.
4) Constante. Si se da alloc y alloc != other.get_allocator(), entonces lineal.
5) N log(N) donde N = init.size() por lo general, lineal en N si 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_view>
#include <set>

void imprimir(const std::string_view nombre, const std::multiset<int>& ms)
{
	std::cout << nombre << ": ";
	for(auto elemento: ms)
		std::cout << elemento << " ";
	std::cout << '\n';
}

int main()
{
	// (1) Constructor por defecto
	std::multiset<int> a;
	a.insert(4);
	a.insert(3);
	a.insert(2);
	a.insert(1);
	imprimir("a", a);

	// (2) Constructor por rango
	std::multiset<int> b(a.begin(), a.find(3));
	imprimir("b", b);

	// (3) Constructor de copia
	std::multiset<int> c(a);
	imprimir("c", c);

	// (4) Constructor de movimiento
	std::multiset<int> d(std::move(a));
	imprimir("d", d);

	// (5) Constructor por lista de inicializadores
	std::multiset<int> e {3,2,1,2,4,7,3};
	imprimir("e", e);
}

Salida:

a: 1 2 3 4 
b: 1 2 
c: 1 2 3 4 
d: 1 2 3 4 
e: 1 2 2 3 3 4 7

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) [editar]