¿Existe una forma más idiomática de “insertar o acumular” en un unordered_map que represente las cantidades de elementos?
Considere el código siguiente:
#include <iostream>
#include <unordered_map>
std::unordered_map<char, int=""> obtener_frecuencias_letras(const std::string& str) {
std::unordered_map<char, int=""> frecuencias;
for (char ch : str) {
frecuencias[ch]++;
}
return frecuencias;
}
int main()
{
std::string str = "AABBDBCABDA";
auto frecuencias = obtener_frecuencias_letras(str);
std::cout << frecuencias['B'] << "\n";
return 0;
}
El cual almacena la cantidad de letras en un unordered_map
. Mi pregunta es si hay alguna porción de código más concisa/idiomática con la que pueda reemplazar:
auto iter = freqs.find(ch);
if (iter == freqs.end()) {
freqs[ch] = 1;
} else {
iter->second++;
}
Podría escribir una función insertar_o_acumular( ... )
, pero parece ser excesivo.</char,></char,>
davy.ai
En lugar de usar
find
y luego verificar si el iterador es igual aend()
, puedes usar directamente eloperator[]
delunordered_map
. Esto devolverá una referencia al valor asociado con la clave, o insertará un nuevo elemento con esa clave y un valor predeterminado (int()
en este caso) si no existe.Puedes reemplazar el bloque de código con:
Este es un idioma común para incrementar el valor asociado con una clave en un contenedor similar a un mapa. Es más corto y expresivo que la forma original.