std::map
es una clase de contenedor en la biblioteca estándar de C++ que almacena elementos formados por parejas clave-valor. La clave es única y se utiliza para acceder al valor asociado a ella. Este contenedor está implementado como un árbol binario balanceado (generalmente un árbol rojo-negro), lo que garantiza una complejidad logarítmica para las operaciones de inserción, eliminación y búsqueda.
Para utilizar std::map
, es necesario incluir la cabecera <map>
:
#include <map>
Puedes declarar un std::map
especificando los tipos de la clave y del valor:
std::map<int, std::string> myMap;
También puedes inicializarlo directamente con una lista de inicialización:
std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}, {3, "three"}};
Puedes insertar elementos usando el método insert
o el operador []
:
myMap.insert({4, "four"});
myMap[5] = "five";
Para acceder a un valor, puedes usar el operador []
o el método at
:
std::string value = myMap[1];
std::string value = myMap.at(2); // Lanza std::out_of_range si la clave no existe
Para eliminar elementos, usa el método erase
:
myMap.erase(1); // Elimina el elemento con clave 1
myMap.clear(); // Elimina todos los elementos
Para buscar un elemento, utiliza el método find
:
auto it = myMap.find(3);
if (it != myMap.end()) {
std::cout << "Found: " << it->second << std::endl;
}
Puedes iterar sobre un std::map
utilizando iteradores:
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
size()
: Devuelve el número de elementos en el mapa.
empty()
: Devuelve true
si el mapa está vacío.
begin()
y end()
: Devuelven iteradores al primer y último elemento.
rbegin()
y rend()
: Devuelven iteradores reversos.
count(key)
: Devuelve 1 si el elemento con la clave existe, de lo contrario 0.
Aquí hay un ejemplo completo que muestra varias operaciones con std::map
:
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<int, std::string> myMap;
// Insertando elementos
myMap[1] = "one";
myMap[2] = "two";
myMap[3] = "three";
// Iterando sobre el map
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
// Accediendo a un elemento
std::cout << "Key 2 has value: " << myMap[2] << std::endl;
// Buscando un elemento
auto it = myMap.find(3);
if (it != myMap.end()) {
std::cout << "Found key 3 with value: " << it->second << std::endl;
}
// Eliminando un elemento
myMap.erase(1);
// Verificando si el map está vacío
if (!myMap.empty()) {
std::cout << "Map size: " << myMap.size() << std::endl;
}
// Limpiando el map
myMap.clear();
std::cout << "Map cleared. Size: " << myMap.size() << std::endl;
return 0;
}
std::map
mantiene los elementos ordenados según las claves.
std::unordered_map
, std::map
puede usar más memoria debido a la estructura de árbol.
std::unordered_map
puede ser más rápido en promedio debido a su complejidad O(1) en operaciones.
std::map
usa un árbol binario balanceado, mientras que std::unordered_map
usa una tabla hash. Esto implica diferentes usos y características:
std::map
mantiene el orden de los elementos basado en las claves.
std::unordered_map
ofrece tiempos de acceso promedio O(1) pero no mantiene el orden.
es una estructura de datos poderosa y flexible que es crucial para muchos algoritmos y aplicaciones en C++. Comprender cómo y cuándo usar std::map puede mejorar significativamente la eficiencia y claridad de tu código.
std::map
Jorge García
Fullstack developer