Menu
Coddy logo textTech

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 completamente

Apó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.

challenge icon

Desafio

Fácil

Crie 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 n representando o número de contatos iniciais
  • Em seguida, n pares de entradas:
    • Uma string representando o nome do contato
    • Uma string representando o número de telefone
  • Um inteiro m representando o número de contatos a serem removidos
  • Em seguida, m strings representando os nomes dos contatos a serem removidos

Seu programa deve:

  1. Criar um std::map<std::string, std::string> chamado contacts
  2. Ler o número de contatos iniciais e preencher o mapa com os nomes dos contatos e os números de telefone
  3. Imprimir o diretório de contatos inicial no formato mostrado abaixo
  4. Ler o número de contatos a serem removidos
  5. Para cada nome de contato a ser removido, usar o método .erase() para removê-lo do mapa
  6. 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 empty

Os 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;
}
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de C++ online