std::map<Key,T,Compare,Allocator>::map - cppreference.com
</tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody>
|
|
(1) | |
|
|
(1) | (desde C++11) |
| (2) | ||
|
|
||
|
|
(desde C++14) | |
|
|
(3) | |
|
|
(3) | (desde C++11) |
|
|
(4) | (desde C++11) |
|
|
(4) | (desde C++11) |
| (5) | ||
|
|
(desde C++11) | |
|
|
(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). 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).
3) Constructor de copia. Construye el contenedor con la copia del contenido de other.
|
Si |
(desde C++11) |
|
El parámetro de plantilla |
(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.
5) Construye el contenedor con el contenido de la lista de inicializadores 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
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> #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.
|