Removendo Pares
Parte da seção Lógica & Fluxo do Journey de C++ da Coddy. Lição 27 de 56.
Às vezes, você precisa remover pares de chave-valor do seu map quando eles não são mais necessários. O método .erase() oferece uma maneira direta de excluir elementos especificando a chave que você deseja remover.
Para remover um elemento de um mapa, basta chamar .erase() com a chave como argumento:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
scores.erase("Bob"); // Remove a entrada de Bob completamenteApós chamar erase("Bob"), o mapa conterá apenas as pontuações de Alice e Carol. Se você tentar apagar uma chave que não existe no mapa, a operação simplesmente não fará nada — nenhum erro ocorrerá.
Ao iterar sobre um mapa com um loop for baseado em range, cada elemento é um std::pair contendo a chave e o valor. Você pode acessar a chave com .first e o valor com .second:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Isso imprimirá cada nome e pontuação em ordem alfabética, pois std::map mantém suas chaves ordenadas automaticamente.
Este método é particularmente útil para manter estruturas de dados organizadas, remover informações desatualizadas ou implementar recursos que permitem aos usuários excluir entradas do seu aplicativo.
Desafio
FácilCrie um programa que gerencie um diretório de contatos usando um std::map. Seu programa armazenará nomes de contatos e números de telefone e, em seguida, permitirá que os usuários removam contatos específicos do diretório usando o método .erase().
As seguintes entradas serão fornecidas:
- Um inteiro
nrepresentando o número de contatos iniciais - Em seguida,
npares de entradas:- Uma string representando o nome do contato
- Uma string representando o número de telefone
- Um inteiro
mrepresentando o número de contatos a serem removidos - Em seguida,
mstrings representando os nomes dos contatos a serem removidos
Seu programa deve:
- Criar um
std::map<std::string, std::string>chamadocontacts - Ler o número de contatos iniciais e preencher o mapa com os nomes dos contatos e os números de telefone
- Imprimir o diretório de contatos inicial no formato mostrado abaixo
- Ler o número de contatos a serem removidos
- Para cada nome de contato a ser removido, usar o método
.erase()para removê-lo do mapa - Imprimir o diretório de contatos atualizado após todas as remoções
Use o seguinte formato de saída exato:
Diretório inicial:
Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...Diretório atualizado após as remoções:
Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...Se o diretório ficar vazio após todas as remoções, imprima:
Updated Contact Directory:
Directory is emptyOs contatos devem ser impressos na ordem em que aparecem ao iterar pelo mapa (ordem alfabética pelo nome do contato). Use um loop for baseado em intervalo para iterar pelo mapa nas duas vezes, acessando cada par de chave e valor com pair.first para o nome do contato e pair.second para o número de telefone. Lembre-se de que tentar apagar um contato que não existe não causará um erro — o mapa simplesmente permanecerá inalterado.
Experimente você mesmo
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Read number of initial contacts
int n;
cin >> n;
// Criar o mapa de contatos
map<string, string> contacts;
// Read initial contacts
for (int i = 0; i < n; i++) {
string name, phone;
cin >> name >> phone;
// TODO: Adicionar o contato ao mapa
}
// Imprimir o diretório inicial
cout << "Initial Contact Directory:" << endl;
// TODO: Imprimir todos os contatos usando um loop for baseado em intervalo
// Ler o número de contatos a remover
int m;
cin >> m;
// Remover contatos
for (int i = 0; i < m; i++) {
string nameToRemove;
cin >> nameToRemove;
// TODO: Remover o contato usando o método .erase()
}
// Imprimir o diretório atualizado
cout << "Updated Contact Directory:" << endl;
// TODO: Print remaining contacts or "Directory is empty" if empty
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Ponteiros e Memória
O que é um Ponteiro?Operador de EndereçoOperador de DesreferenciaçãoPonteiros NulosPonteiros e ArraysMemória Dinâmica com 'new'Liberando Memória com 'delete'Recapitulação - Prática com Ponteiros4Mapas (Pares Chave-Valor)
Introdução ao std::mapCriando um MapaAcessando e Modificando ValoresVerificando ChavesRemovendo ParesIterando sobre um MapaRecapitulação - Frequência de Palavras2Vetores (Arrays Dinâmicos)
Introdução ao std::vectorCriando um VetorAdicionando ElementosAcessando ElementosTamanho do VetorIterando com um Loop ForLoop For Baseado em IntervaloRemovendo ElementosRecapitulação - Operações com Vetores3Projeto: Ferramenta de Lista de Tarefas
Visão Geral do ProjetoAdicionando uma TarefaPratique por conta própria: Compilador de C++ online