Menu
Coddy logo textTech

Rimuovere coppie

Fa parte della sezione Logica e flusso del percorso C++ di Coddy. Lezione 27 di 56.

A volte devi rimuovere le coppie chiave-valore dalla tua mappa quando non ti servono più. Il metodo .erase() offre un modo semplice per eliminare gli elementi specificando la chiave che vuoi rimuovere.

Per rimuovere un elemento da una mappa, chiama semplicemente .erase() passando la chiave come argomento:

std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;

scores.erase("Bob"); // Rimuove completamente la voce di Bob

Dopo aver chiamato erase("Bob"), la mappa conterrà solo i punteggi di Alice e Carol. Se provi a eliminare una chiave che non esiste nella mappa, l'operazione semplicemente non fa nulla: non si verifica alcun errore.

Quando iteri su una mappa con un ciclo for basato su un intervallo, ogni elemento è uno std::pair che contiene la chiave e il valore. Puoi accedere alla chiave con .first e al valore con .second:

for (auto pair : scores) {
    std::cout << pair.first << ": " << pair.second << std::endl;
}

Questo stamperà ogni nome e punteggio in ordine alfabetico, poiché std::map mantiene automaticamente le sue chiavi ordinate.

Questo metodo è particolarmente utile per mantenere strutture dati pulite, rimuovere informazioni obsolete o implementare funzionalità che consentono agli utenti di eliminare voci dalla tua applicazione.

challenge icon

Sfida

Facile

Crea un programma che gestisca una rubrica usando una std::map. Il programma memorizzerà i nomi dei contatti e i numeri di telefono, quindi permetterà agli utenti di rimuovere contatti specifici dalla rubrica usando il metodo .erase().

Verranno forniti i seguenti input:

  • Un intero n che rappresenta il numero di contatti iniziali
  • Poi n coppie di input:
    • Una stringa che rappresenta il nome del contatto
    • Una stringa che rappresenta il numero di telefono
  • Un intero m che rappresenta il numero di contatti da rimuovere
  • Poi m stringhe che rappresentano i nomi dei contatti da rimuovere

Il programma dovrebbe:

  1. Creare una std::map<std::string, std::string> chiamata contacts
  2. Leggere il numero di contatti iniziali e popolare la mappa con i nomi dei contatti e i numeri di telefono
  3. Stampare la rubrica iniziale nel formato mostrato di seguito
  4. Leggere il numero di contatti da rimuovere
  5. Per ogni nome di contatto da rimuovere, usare il metodo .erase() per rimuoverlo dalla mappa
  6. Stampare la rubrica aggiornata dopo tutte le rimozioni

Usa il seguente formato di output esatto:

Rubrica iniziale:

Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...

Rubrica aggiornata dopo le rimozioni:

Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...

Se la rubrica diventa vuota dopo tutte le rimozioni, stampa:

Updated Contact Directory:
Directory is empty

I contatti devono essere stampati nell'ordine in cui compaiono durante l'iterazione sulla mappa (in ordine alfabetico per nome del contatto). Usa un ciclo for basato sull'intervallo per iterare sulla mappa entrambe le volte, accedendo a ciascuna coppia chiave-valore con pair.first per il nome del contatto e pair.second per il numero di telefono. Ricorda che tentare di cancellare un contatto che non esiste non causerà un errore: la mappa rimarrà semplicemente invariata.

Provalo tu

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
    // Leggi il numero di contatti iniziali
    int n;
    cin >> n;
    
    // Crea la mappa dei contatti
    map<string, string> contacts;
    
    // Leggi i contatti iniziali
    for (int i = 0; i < n; i++) {
        string name, phone;
        cin >> name >> phone;
        // TODO: Aggiungi il contatto alla mappa
    }
    
    // Stampa la rubrica iniziale
    cout << "Initial Contact Directory:" << endl;
    // TODO: Stampa tutti i contatti usando un ciclo for basato su intervallo
    
    // Leggi il numero di contatti da rimuovere
    int m;
    cin >> m;
    
    // Rimuovi i contatti
    for (int i = 0; i < m; i++) {
        string nameToRemove;
        cin >> nameToRemove;
        // TODO: Rimuovi il contatto usando il metodo .erase()
    }
    
    // Stampa la rubrica aggiornata
    cout << "Updated Contact Directory:" << endl;
    // TODO: Stampa i contatti rimanenti oppure "Directory is empty" se la rubrica è vuota
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore C++ online