Contenedores / C++17

Map

Llevar al apunte ↗

Descripción

Un map<Clave, Valor> asocia un valor a cada clave distinta. Por ejemplo, map<string, int> puede guardar la cantidad de apariciones de cada palabra y map<string, string> puede guardar una traducción por palabra.

Usalo cuando necesitás recuperar información por una clave, especialmente si las claves son textos o números muy dispersos. Un vector es práctico cuando las claves son índices chicos y consecutivos. Un set sirve cuando alcanza con guardar la presencia de cada valor.

El map mantiene las claves ordenadas y cada clave aparece una vez. m[clave] permite leer o modificar su valor asociado. Si la clave falta, esa operación crea una entrada con su valor inicial, como 0 para un int o un string vacío. Para consultar sin agregar entradas, usá find.

Funciones y operaciones

Uso Parámetros Resultado o efecto Modifica m
map<string, int> m; Tipos de clave y valor Crea el map vacío Lo crea
m[clave] = valor Clave y valor Crea o actualiza la asociación Sí
++m[clave] Clave Incrementa el contador, que empieza en 0 si faltaba Sí
m[clave] Clave Acceso al valor, agregando la clave si falta Si faltaba
m.find(clave) Clave Iterador al par o m.end() No
m.count(clave) Clave 0 o 1 según si la clave existe No
m.size() / m.empty() Ninguno Cantidad de claves / si está vacío No
m.erase(clave) Clave Quita la entrada y devuelve 0 o 1 Si estaba
m.clear() Ninguno Quita todas las entradas Sí

Ejemplos

Contar por clave

vector<string> palabras = {"casa", "mesa", "casa"};
map<string, int> frecuencia;
for (const string& palabra : palabras) {
    ++frecuencia[palabra];
}
int veces = frecuencia["casa"]; // 2
int claves = static_cast<int>(frecuencia.size()); // 2
int existe = static_cast<int>(frecuencia.count("casa")); // 1

El contador de apariciones es el valor asociado. count pregunta si existe esa clave.

Consultar sin insertar

map<string, int> frecuencia = {{"casa", 2}, {"mesa", 1}};
auto it = frecuencia.find("patio");
int veces = (it == frecuencia.end()) ? 0 : it->second;
// veces vale 0 y frecuencia conserva dos claves

it->first es la clave y it->second el valor del par señalado. Leelos cuando it != m.end().

Guardar una traducción

map<string, string> traduccion;
traduccion["casa"] = "house";
traduccion["mesa"] = "table";
string palabra = traduccion["casa"]; // "house"

Recorrer claves y valores

map<string, int> frecuencia = {{"mesa", 1}, {"casa", 2}};
for (const auto& [palabra, cantidad] : frecuencia) {
    cout << palabra << ' ' << cantidad << '\n';
}
// Salida en orden de clave: casa 2, luego mesa 1.

Buscar, agregar o borrar por clave cuesta O(log n), con n claves. Si usás m[clave] para una consulta, contá también su posible efecto sobre el tamaño.