es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En lugar de usar find y luego verificar si el iterador es igual a end(), puedes usar directamente el operator[] del unordered_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:

    freqs[ch]++;
    

    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.

Comments are closed.