Namespaces
Variants

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

From cppreference.net

(1)
multiset ( ) ;
(hasta C++11)
multiset ( ) : multiset ( Compare ( ) ) { }
(desde C++11)
(constexpr desde C++26)
explicit multiset ( const Compare & comp,
const Allocator & alloc = Allocator ( ) ) ;
(2) (constexpr desde C++26)
explicit multiset ( const Allocator & alloc ) ;
(3) (desde C++11)
(constexpr desde C++26)
template < class InputIt >

multiset ( InputIt first, InputIt last,
const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(4) (constexpr desde C++26)
template < class InputIt >

multiset ( InputIt first, InputIt last,
const Allocator & alloc )

: multiset ( first, last, Compare ( ) , alloc ) { }
(5) (desde C++14)
(constexpr desde C++26)
multiset ( const multiset & other ) ;
(6) (constexpr desde C++26)
multiset ( const multiset & other, const Allocator & alloc ) ;
(7) (desde C++11)
(constexpr desde C++26)
multiset ( multiset && other ) ;
(8) (desde C++11)
(constexpr desde C++26)
multiset ( multiset && other, const Allocator & alloc ) ;
(9) (desde C++11)
(constexpr desde C++26)
multiset ( std:: initializer_list < value_type > init,

const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(10) (desde C++11)
(constexpr desde C++26)
multiset ( std:: initializer_list < value_type > init,

const Allocator & alloc )

: multiset ( init, Compare ( ) , alloc ) { }
(11) (desde C++14)
(constexpr desde C++26)
template < container-compatible-range < value_type > R >

multiset ( std:: from_range_t , R && rg,
const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(12) (desde C++23)
(constexpr desde C++26)
template < container-compatible-range < value_type > R >

multiset ( std:: from_range_t , R && rg,
const Allocator & alloc )

: multiset ( std:: from_range , std:: forward < R > ( rg ) , Compare ( ) , alloc ) { }
(13) (desde C++23)
(constexpr desde C++26)

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

1-3) Construye un contenedor vacío.
4,5) Construye el contenedor con los contenidos del rango [ first , last ) .
Si [ first , last ) no es un rango válido , el comportamiento es indefinido.
6,7) Construye el contenedor con la copia de los contenidos de other .

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

(desde C++11)

Durante la deducción de argumentos de plantilla de clase , solo el primer argumento contribuye a la deducción del parámetro de plantilla Allocator del contenedor.

(desde C++23)
8,9) Construye el contenedor con el contenido de other usando semántica de movimiento. Si alloc no es proporcionado, el asignador se obtiene mediante construcción por movimiento del asignador perteneciente a other .

Durante la deducción de argumentos de plantilla de clase , solo el primer argumento contribuye a la deducción del parámetro de plantilla Allocator del contenedor.

(desde C++23)
10,11) Construye el contenedor con los contenidos de la lista de inicialización init .
12,13) Construye el contenedor con el contenido de rg .

Contenidos

Parámetros

alloc - asignador a utilizar para todas las asignaciones de memoria de este contenedor
comp - objeto función de comparación para usar en todas las comparaciones de claves
first, last - el par de iteradores que define el rango fuente de elementos a copiar
other - otro contenedor que se utilizará como fuente para inicializar los elementos del contenedor
init - lista de inicialización para inicializar los elementos del contenedor
rg - un rango compatible con contenedor , es decir, un input_range cuyos elementos son convertibles a value_type
Requisitos de tipo
-
InputIt debe cumplir con los requisitos de LegacyInputIterator .
-
Compare debe cumplir con los requisitos de Compare .
-
Allocator debe cumplir con los requisitos de Allocator .

Complejidad

1-3) Constante.
4,5) N·log(N) donde N es std:: distance ( first, last ) en general, lineal en N si [ first , last ) ya está ordenado por value_comp ( ) .
6,7) Lineal en el tamaño de other .
8,9) Constante. Si alloc es proporcionado y alloc ! = other. get_allocator ( ) , entonces lineal.
10,11) N·log(N) donde N es init. size ( ) en general, lineal en N si init ya está ordenado por value_comp ( ) .
12,13) N·log(N) donde N es ranges:: distance ( rg ) en general, lineal en N si rg ya está ordenado por value_comp ( ) .

Excepciones

Las llamadas a Allocator::allocate pueden lanzar excepciones.

Notas

Después de la construcción por movimiento del contenedor (sobrecarga ( 8,9 ) ), las referencias, punteros e iteradores (excepto el iterador final) a other permanecen válidos, pero referencian elementos que ahora están en * this . El estándar actual garantiza esto mediante la declaración general en [container.reqmts]/67 , y se está considerando una garantía más directa a través de LWG issue 2321 .

Aunque no es formalmente requerido hasta C++23, algunas implementaciones ya han colocado el parámetro de plantilla Allocator en contextos no deducidos en modos anteriores.

Macro de prueba de características Valor Estándar Característica
__cpp_lib_containers_ranges 202202L (C++23) Construcción e inserción consciente de rangos; sobrecargas ( 12,13 )

Ejemplo

#include <iostream>
#include <set>
#include <string_view>
template <typename T>
void println(const std::string_view name, const std::multiset<T>& ms)
{
    std::cout << name << ": ";
    for (const auto& element : ms)
        std::cout << element << ' ';
    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);
    println("a", a);
    // (4) Constructor de rango
    std::multiset<int> b(a.begin(), a.find(3));
    println("b", b);
    // (6) Constructor de copia
    std::multiset<int> c(a);
    println("c", c);
    // (8) Constructor de movimiento
    std::multiset<int> d(std::move(a));
    println("d", d);
    // (10) Constructor de lista de inicialización
    std::multiset<int> e{3, 2, 1, 2, 4, 7, 3};
    println("e", e);
    // (12) Constructor de rango
    const auto w = {"α", "β", "γ", "δ", "δ", "γ", "β", "α"};
#if __cpp_lib_containers_ranges
    std::multiset<std::string> f(std::from_range, w); // sobrecarga (12)
#else
    std::multiset<std::string> f(w.begin(), w.end()); // alternativa a (4)
#endif
    println("f", f);
}

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
f: α α β β γ γ δ δ

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 2076 C++11 sobrecarga ( 4 ) requería condicionalmente que Key fuera CopyInsertable en * this no requerido
LWG 2193 C++11 el constructor por defecto era explícito hecho no explícito

Véase también

asigna valores al contenedor
(función miembro pública)