Fácil C++

Contando palavras com map

Enunciado

Escreva um programa que leia uma sequência de palavras da entrada padrão e conte quantas vezes cada palavra aparece. Use std::map<std::string, int> para armazenar as contagens e imprima cada palavra e sua contagem em ordem alfabética.

Requisitos

  • Usar std::map<std::string, int> para armazenar as contagens.
  • Ler palavras até o fim da entrada (EOF).
  • Imprimir cada palavra e sua contagem em ordem alfabética, uma por linha no formato palavra: contagem.

Código inicial

#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, int> contagem;
    std::string palavra;
    // TODO: leia as palavras e atualize contagem
    // TODO: imprima os resultados
    return 0;
}

Saída esperada

apple: 2
banana: 1
cherry: 3
Ver dica

Use while (std::cin >> palavra) para ler até o fim. Para incrementar, contagem[palavra]++ já cria a entrada com valor 0 se não existir.

Mostrar solução
#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, int> contagem; // mapa ordenado: palavra -> contagem
    std::string palavra;
    while (std::cin >> palavra) {        // lê até EOF
        contagem[palavra]++;             // incrementa; cria entrada se não existir
    }
    for (const auto& [palavra, qtd] : contagem) { // iteração ordenada
        std::cout << palavra << ": " << qtd << "\n";
    }
    return 0;
}

Passo a passo

  1. Incluímos <map> e <string> para usar o container e a string.
  2. Declaramos std::map<std::string, int> contagem, que associa cada palavra a um contador.
  3. O laço while (std::cin >> palavra) lê palavras separadas por espaço até o fim da entrada.
  4. contagem[palavra]++ usa o operador [], que insere a chave com valor 0 se ela não existir, e então incrementa.
  5. O laço for com structured bindings percorre o mapa em ordem alfabética (pois std::map é ordenado).
  6. Imprimimos cada par no formato palavra: contagem.

Por que funciona

std::map mantém as chaves ordenadas e permite acesso rápido por chave. O operador [] é conveniente para contagem porque inicializa automaticamente o valor para o tipo (0 para int). A iteração segue a ordem crescente das chaves, garantindo saída alfabética.

Erros comuns

  • Esquecer de incluir <map>: erro de compilação 'map' is not a member of 'std'.
  • Usar contagem[palavra] sem incrementar: imprime sempre 0.
  • Tentar iterar com for (auto& p : contagem) e acessar p.first/p.second sem const: funciona, mas prefira const auto& para evitar cópias.

Outra forma de resolver

Usar std::unordered_map e depois ordenar as chaves com std::vector e std::sort:

std::unordered_map<std::string, int> contagem;
// ... preencher ...
std::vector<std::string> palavras;
for (const auto& p : contagem) palavras.push_back(p.first);
std::sort(palavras.begin(), palavras.end());
for (const auto& p : palavras) std::cout << p << ": " << contagem[p] << "\n";

Prefira std::map quando a ordem é necessária e o número de elementos não é gigantesco.

Saída esperada

apple: 2
banana: 1
cherry: 3