std::map<Key,T,Compare,Allocator>::map
map(); explicit map( const Compare& comp, {{#pad:|12}} const Allocator& alloc = Allocator() ); |
(1) | |
explicit map( const Allocator& alloc ); |
(1) | (desde C++11) |
| (2) | ||
template< class InputIt > map( InputIt first, InputIt last, {{#pad:|3}} const Compare& comp = Compare(), {{#pad:|3}} const Allocator& alloc = Allocator() ); |
||
template< class InputIt > map( InputIt first, InputIt last, {{#pad:|3}} const Allocator& alloc ); |
(desde C++14) | |
map( const map& other ); |
(3) | |
map( const map& other, const Allocator& alloc ); |
(3) | (desde C++11) |
map( map&& other ); |
(4) | (desde C++11) |
map( map&& other, const Allocator& alloc ); |
(4) | (desde C++11) |
| (5) | ||
map( std::initializer_list<value_type> init, {{#pad:|3}} const Compare& comp = Compare(), {{#pad:|3}} const Allocator& alloc = Allocator() ); |
(desde C++11) | |
map( std::initializer_list<value_type> init, {{#pad:|3}} 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.
[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 |
(desde C++11) |
|
El parámetro de plantilla |
(desde C++23) |
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 |
(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 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
N = std::distance(first, last) por lo 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() 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>
#include <iomanip>
#include <map>
template<typename Map>
void imprimir_mapa(Map& m)
{
std::cout << '{';
for(auto& p: m)
std::cout << p.first << ':' << p.second << ' ';
std::cout << "}\n";
}
struct Punto { double x, y; };
struct CompDePuntos { // comparador de tipos Punto
bool operator()(const Punto& lhs, const Punto& rhs) const {
return lhs.x < rhs.x; // NB. intencionalmente ignora a y
}
};
int main()
{
// (1) Constructor por defecto
std::map<std::string, int> mapa1;
mapa1["algo"] = 69;
mapa1["lo que sea"] = 199;
mapa1["esa cosa"] = 50;
std::cout << "mapa1 = "; imprimir_mapa(mapa1);
// (2) Constructor por rango
std::map<std::string, int> iter(mapa1.find("lo que sea"), mapa1.end());
std::cout << "\niter = "; imprimir_mapa(iter);
std::cout << "mapa1 = "; imprimir_mapa(mapa1);
// (3) Constructor de copia
std::map<std::string, int> copiado(mapa1);
std::cout << "\ncopiado = "; imprimir_mapa(copiado);
std::cout << "mapa1 = "; imprimir_mapa(mapa1);
// (4) Constructor de movimiento
std::map<std::string, int> movido(std::move(mapa1));
std::cout << "\nmovido = "; imprimir_mapa(movido);
std::cout << "mapa1 = "; imprimir_mapa(mapa1);
// (5) Constructor por lista de inicializadores
const std::map<std::string, int> init {
{"esto", 100},
{"puede", 100},
{"ser", 100},
{"const", 100},
};
std::cout << "\ninit = "; imprimir_mapa(init);
// Clase Key personalizada, opción 1:
// Usar una estructura de comparación
std::map<Punto, double, CompDePuntos> mag = {
{ {5, -12}, 13 },
{ {3, 4}, 5 },
{ {-8, -15}, 17 }
};
for(auto p : mag)
std::cout << "La magnitud de (" << p.first.x
<< ", " << p.first.y << ") es "
<< p.second << '\n';
// Clase Key personalizada, opción 2:
// Usar una lambda de comparación
// Esta lambda ordena Puntos de acuerdo a sus magnitudes, donde observa que
// estas magnitudes se toman de la variable local mag
auto cmpLambda = [&mag](const Punto &lhs, const Punto &rhs) { return mag[lhs] < mag[rhs]; };
// También podrías usar una lambda que no depende de variables locales, así:
// auto cmpLambda = [](const Punto &lhs, const Punto &rhs) { return lhs.y < rhs.y; };
std::map<Punto, double, decltype(cmpLambda)> magy(cmpLambda);
// Varias maneras de insertar elementos:
magy.insert(std::pair<Punto, double>({5, -12}, 13));
magy.insert({ {3, 4}, 5});
magy.insert({Punto{-8.0, -15.0}, 17});
std::cout << '\n';
for(auto p : magy)
std::cout << "La magnitud de (" << p.first.x
<< ", " << p.first.y << ") is "
<< p.second << '\n';
}
Salida:
mapa1 = {lo que sea:199 algo:69 esa cosa:50 }
iter = {lo que sea:199 algo:69 esa cosa:50 }
mapa1 = {lo que sea:199 algo:69 esa cosa:50 }
copiado = {lo que sea:199 algo:69 esa cosa:50 }
mapa1 = {lo que sea:199 algo:69 esa cosa:50 }
movido = {lo que sea:199 algo:69 esa cosa:50 }
mapa1 = {}
init = {ser:100 puede:100 const:100 esto:100 }
La magnitud de (-8, -15) es 17
La magnitud de (3, 4) es 5
La magnitud de (5, -12) es 13
La magnitud de (3, 4) es 5
La magnitud de (5, -12) es 13
La magnitud de (-8, -15) es 17
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) |