DMarlon Studio

Lección 15 · 15 de 20

Mapas · C++

Guarde pares clave-valor en C++ con std::map: el inventario de una frutería con [], count(), erase() y un recorrido en orden alfabético.

C++ · Mapas en DMarlon Studio: el código del ejemplo y su salida en la terminal

`std::map` relaciona claves con valores, como un diccionario. Se declara con los dos tipos: std::map<std::string, int> va del nombre de la fruta a su cantidad. Necesita #include <map>.

`[]` lee el valor de una clave (stock["apples"] da 12) y también lo cambia, o crea la clave si no existe: stock["kiwis"] = 20 añade los kiwis. Cuidado: solo con leer stock["bananas"] también se crearía, con valor 0.

Para comprobar una clave sin crearla está `count()`, que en un map da 0 o 1. `erase()` borra una clave junto con su valor. Y at(), como en los vectores, lanza un error si la clave no existe.

Un map guarda las claves ordenadas: al recorrerlo salen apples, kiwis y pears, en orden alfabético y no en el que se añadieron. Cada elemento es un par: item.first es la clave e item.second, el valor.

Contar es un uso clásico: letters[c]++ funciona aunque la letra todavía no esté, porque [] la crea con 0 y después le suma uno. Así se cuentan las letras de banana.

Código · main.cpp

#include <iostream>#include <map>#include <string>int main() {    // A map links keys to values, and keeps the keys in order.    std::map<std::string, int> stock = {{"pears", 5}, {"apples", 12}, {"plums", 0}};    std::cout << "Apples: " << stock["apples"] << '\n';    // [] changes a value, or creates the key if it is new.    stock["pears"] = 8;    stock["kiwis"] = 20;    // count() checks a key without creating it (0 or 1).    if (stock.count("bananas") == 0) std::cout << "No bananas today\n";    // erase() removes a key together with its value.    stock.erase("plums");    // Each element is a pair: first is the key and second, the value.    int pieces = 0;    for (const auto& item : stock) {        std::cout << item.first << ": " << item.second << '\n';        pieces += item.second;    }    std::cout << stock.size() << " fruits, " << pieces << " pieces\n";    // Counting is a classic job: a missing key starts at 0.    std::map<char, int> letters;    for (char c : std::string("banana")) letters[c]++;    for (const auto& item : letters) std::cout << item.first << '=' << item.second << ' ';    std::cout << '\n';    return 0;}

Salida · c++ -std=c++17 main.cpp -o main && ./main

Apples: 12
No bananas today
apples: 12
kiwis: 20
pears: 8
3 fruits, 40 pieces
a=3 b=1 n=2

Para recordar

  • std::map<Clave, Valor> relaciona claves con valores.
  • m[clave] = valor cambia o añade.
  • Leer m[clave] crea la clave si no existe.
  • count() comprueba una clave sin crearla y erase() la borra.
  • Las claves se recorren siempre en orden.

Ejercicio

Con un std::map<std::string, int>, cuente cuántas veces aparece cada color en un vector {"red", "blue", "red", "green", "blue", "red"} y escriba el resultado.