Quiero tener un mapa de CString sy contarlos en pares mapeados.

Por ejemplo si tengo:

"Banana",
"Banana",
"Apple",
"Apple",
"Pear"

Quiero tener ("Banana", 2), ("Apple", 2), ("Pear", 1).

int sortFruit (std::map<CString, int> &mapFruitTypes)
{
   for (const auto& a : someArray)
        {
            CString fruitType = a -> GetFruitType();

            int i = 0;

            mapFruitTypes.emplace(fruitType , i++);
        }

        return 0;
}

¿Es esta la forma correcta de hacerlo? ¿O debería usar algo más (en lugar de emplace?)

c++
0
harunB10 17 abr. 2020 a las 10:58

2 respuestas

La mejor respuesta

Simplemente puede incrementar el valor del mapa para cada tipo de fruta como los ve. Al acceder al valor del mapa con operador [], obtiene insertado y también se inicializa el valor para el tipo (por lo que el valor obtiene 0 - para el tipo int).

Esto es suficiente (tanto para insertar nuevas claves como para contarlas):

   for (const auto& a : someArray)
   {
            CString fruitType = a -> GetFruitType();
            mapFruitTypes[fruitType]++;
   }
2
usr 17 abr. 2020 a las 08:41

Básicamente, hay tres formas de asignar la clave al recuento actual de la clave.

Método 1:

Use el std::map::operator[]:

int sortFruit (std::map<CString, int> &mapFruitTypes)
{
   for (const auto& a : someArray)
       mapFruitTypes[a->GetFruitType()]++;
   return 0;
}

Método 2:

Utilice el método std :: map :: insert y aproveche del valor de retorno (que es un std::pair<iterator, bool>), donde iterator es el iterador del elemento insertado, o el elemento existente si la clave ya existe.

int sortFruit (std::map<CString, int> &mapFruitTypes)
{
   for (const auto& a : someArray)
       mapFruitTypes.insert({a->GetFruitType(), 0}).first->second++;
   return 0;
}

Método 3:

Utilice el std :: map :: emplace y aproveche del valor de retorno, similar al Método 2:

int sortFruit (std::map<CString, int> &mapFruitTypes)
{
   for (const auto& a : someArray)
       mapFruitTypes.emplace(a->GetFruitType(), 0).first->second++;
   return 0;
}
1
PaulMcKenzie 17 abr. 2020 a las 08:44