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
- Incluímos
<map>e<string>para usar o container e a string. - Declaramos
std::map<std::string, int> contagem, que associa cada palavra a um contador. - O laço
while (std::cin >> palavra)lê palavras separadas por espaço até o fim da entrada. contagem[palavra]++usa o operador[], que insere a chave com valor 0 se ela não existir, e então incrementa.- O laço
forcom structured bindings percorre o mapa em ordem alfabética (poisstd::mapé ordenado). - 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 acessarp.first/p.secondsemconst: funciona, mas prefiraconst auto¶ 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