Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: map

From cppreference.net

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

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

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

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

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

const Compare & comp = Compare ( ) ,

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

const Allocator & alloc )

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

map ( 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 >

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

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

Construye un nuevo contenedor a partir de una variedad de 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.

(since 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 se refieren a 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 .

Si múltiples elementos en el rango tienen claves que son equivalentes al comparar, no está especificado qué elemento se inserta (pendiente de LWG2844 ).

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 Std Característica
__cpp_lib_containers_ranges 202202L (C++23) Construcción e inserción con reconocimiento de rangos; sobrecargas ( 12,13 )

Ejemplo

#include <iomanip>
#include <iostream>
#include <map>
#include <string>
template<typename Key, typename Value, typename Cmp>
std::ostream& operator<<(std::ostream& os, const std::map<Key, Value, Cmp>& map)
{
    os << "{ ";
    for (auto comma{map.size()}; const auto& p : map)
        os << '\'' << p.primero << "' es " << p.second << (--comma ? ", " : " ");
    return os << "}\n";
}
struct Point
{
    double x, y;
    friend std::ostream& operator<<(std::ostream& os, Point pt)
    {
        return os << '(' << pt.x << ", " << pt.y << ')';
    }
};
struct PointCmp
{
    bool operator()(const Point& lhs, const Point& rhs) const
    {
        return lhs.x < rhs.x; // NB: y se ignora intencionalmente
    }
};
int main()
{
    // (1) Constructor predeterminado
    std::map<std::string, int> map1;
    map1["algo"] = 69;
    map1["anything"] = 199;
    map1["esa cosa"] = 50;
    std::cout << "map1 = " << map1;
    // (4) Constructor de rango
    std::map<std::string, int> iter(map1.find("anything"), map1.end());
    std::cout << "\niter = " << iter;
    std::cout << "map1 = " << map1;
    // (6) Constructor de copia
    std::map<std::string, int> copied(map1);
    std::cout << "\ncopied = " << copied;
    std::cout << "map1 = " << map1;
    // (8) Constructor de movimiento
    std::map<std::string, int> moved{std::move(map1)};
    std::cout << "\nmoved = " << moved;
    std::cout << "map1 = " << map1;
    // (10) Constructor de lista de inicializadores
    const std::map<std::string, int> init
    {
        {"this", 100},
        {"puede", 100},
        {"ser", 100},
        {"const", 100}
    };
    std::cout << "\ninit = " << init;
    std::cout << "\nClase Key personalizada opción 1:\n";
    // Usar una estructura de comparación
    std::map<Point, double, PointCmp> mag =
    {
        {{5, -12}, 13},
        {{3, 4}, 5},
        {{-8, -15}, 17}
    };
    std::cout << "mag = " << mag << '\n';
    std::cout << "Opción 2 de clase de clave personalizada:\n";
    // Usar una lambda de comparación
    // Esta lambda ordena puntos según sus magnitudes, donde
    // estas magnitudes se toman de la variable local mag.
    auto cmpLambda = [&mag](const Point& lhs, const Point& rhs)
    {
        return mag[lhs] < mag[rhs];
    };
    // También podrías usar una lambda que no dependa de variables locales, así:
    // auto cmpLambda = [](const Point& lhs, const Point& rhs){ return lhs.y < rhs.y; };
    std::map<Point, double, decltype(cmpLambda)> magy(cmpLambda);
    // Varias formas de insertar elementos:
    magy.insert(std::pair<Point, double>({5, -12}, 13));
    magy.insert({{3, 4}, 5});
    magy.insert({Point{-8.0, -15.0}, 17});    
    std::cout << "magy = " << magy << '\n';
    std::cout << "Construcción desde un rango:\n";
    using PS = std::pair<const std::string, int>;
    const auto rg = {PS{"uno", 1}, {"uno", 101}, {"dos", 2}, {"tres", 3}};
#if __cpp_lib_containers_ranges
    std::map<std::string, int> nums(std::from_range, rg); // sobrecarga (12)
#else
    std::map<std::string, int> nums(rg.begin(), rg.end()); // recurrir a (4)
#endif
    std::cout << "nums = " << nums << '\n';
}

Salida:

map1 = { 'anything' es 199, 'something' es 69, 'that thing' es 50 }
iter = { 'anything' es 199, 'something' es 69, 'that thing' es 50 }
map1 = { 'anything' es 199, 'something' es 69, 'that thing' es 50 }
copied = { 'anything' es 199, 'something' es 69, 'that thing' es 50 }
map1 = { 'anything' es 199, 'something' es 69, 'that thing' es 50 }
moved = { 'anything' es 199, 'something' es 69, 'that thing' es 50 }
map1 = { }
init = { 'be' es 100, 'can' es 100, 'const' es 100, 'this' es 100 }
Clase de Clave Personalizada opción 1:
mag = { '(-8, -15)' es 17, '(3, 4)' es 5, '(5, -12)' es 13 }
Clase de Clave Personalizada opción 2:
magy = { '(3, 4)' es 5, '(5, -12)' es 13, '(-8, -15)' es 17 }
Construcción desde un rango:
nums = { 'one' es 1, 'three' es 3, 'two' es 2 }

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
LWG 2076 C++11 la sobrecarga ( 4 ) requería condicionalmente que Key y T fueran 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)