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 BobDopo 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.
Sfida
FacileCrea 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
nche rappresenta il numero di contatti iniziali - Poi
ncoppie di input:- Una stringa che rappresenta il nome del contatto
- Una stringa che rappresenta il numero di telefono
- Un intero
mche rappresenta il numero di contatti da rimuovere - Poi
mstringhe che rappresentano i nomi dei contatti da rimuovere
Il programma dovrebbe:
- Creare una
std::map<std::string, std::string>chiamatacontacts - Leggere il numero di contatti iniziali e popolare la mappa con i nomi dei contatti e i numeri di telefono
- Stampare la rubrica iniziale nel formato mostrato di seguito
- Leggere il numero di contatti da rimuovere
- Per ogni nome di contatto da rimuovere, usare il metodo
.erase()per rimuoverlo dalla mappa - 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 emptyI 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;
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Puntatori e memoria
Che cos'è un puntatore?Operatore indirizzoOperatore di dereferenziazionePuntatori nulliPuntatori e arrayMemoria dinamica con 'new'Liberare la memoria con 'delete'Riepilogo - Esercizi sui puntatori4Mappe (coppie chiave-valore)
Introduzione a std::mapCreare una mappaAccedere ai valori e modificarliVerificare la presenza di chiaviRimuovere coppieIterare su una mappaRiepilogo - Frequenza delle parole2Vettori (array dinamici)
Introduzione a std::vectorCreare un vettoreAggiungere elementiAccedere agli elementiDimensione del vettoreIterare con un ciclo forCiclo for basato su intervalloRimuovere elementiRiepilogo - Operazioni sui vettori5Progetto: strumento per l’inventario
Configurazione del progettoAggiunta e aggiornamento degli articoli3Progetto: Strumento per l’elenco delle attività
Panoramica del progettoAggiungere un’attivitàEsercitati da solo: Compilatore C++ online