Paare entfernen
Teil des Abschnitts Logik & Ablauf der C++-Journey von Coddy — Lektion 27 von 56.
Manchmal müssen Sie Schlüssel-Wert-Paare aus Ihrer Map entfernen, wenn diese nicht mehr benötigt werden. Die Methode .erase() bietet eine unkomplizierte Möglichkeit, Elemente zu löschen, indem Sie den zu entfernenden Schlüssel angeben.
Um ein Element aus einer Map zu entfernen, rufen Sie einfach .erase() mit dem Schlüssel als Argument auf:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
scores.erase("Bob"); // Entfernt Bobs Eintrag vollständigNach dem Aufruf von erase("Bob") wird die Map nur noch die Ergebnisse von Alice und Carol enthalten. Wenn Sie versuchen, einen Schlüssel zu löschen, der in der Map nicht existiert, macht die Operation einfach nichts – es tritt kein Fehler auf.
Beim Iterieren über eine Map mit einer bereichsbasierten for-Schleife ist jedes Element ein std::pair, das den Schlüssel und den Wert enthält. Sie können auf den Schlüssel mit .first und auf den Wert mit .second zugreifen:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Dies gibt jeden Namen und jede Punktzahl in alphabetischer Reihenfolge aus, da std::map seine Schlüssel automatisch sortiert hält.
Diese Methode ist besonders nützlich für die Pflege sauberer Datenstrukturen, das Entfernen veralteter Informationen oder die Implementierung von Funktionen, bei denen Benutzer Einträge aus Ihrer Anwendung löschen können.
Aufgabe
EinfachErstellen Sie ein Programm, das ein Kontaktverzeichnis mithilfe einer std::map verwaltet. Ihr Programm soll Kontaktnamen und Telefonnummern speichern und es den Benutzern ermöglichen, bestimmte Kontakte mithilfe der Methode .erase() aus dem Verzeichnis zu entfernen.
Die folgenden Eingaben werden bereitgestellt:
- Ein Ganzzahlwert
n, der die Anzahl der anfänglichen Kontakte darstellt - Anschließend
nPaare von Eingaben:- Ein String, der den Kontaktnamen darstellt
- Ein String, der die Telefonnummer darstellt
- Ein Ganzzahlwert
m, der die Anzahl der zu entfernenden Kontakte darstellt - Anschließend
mStrings, die die zu entfernenden Kontaktnamen darstellen
Ihr Programm sollte:
- Eine
std::map<std::string, std::string>namenscontactserstellen - Die Anzahl der anfänglichen Kontakte einlesen und die Map mit Kontaktnamen und Telefonnummern füllen
- Das ursprüngliche Kontaktverzeichnis im unten gezeigten Format ausgeben
- Die Anzahl der zu entfernenden Kontakte einlesen
- Für jeden zu entfernenden Kontaktnamen die Methode
.erase()verwenden, um ihn aus der Map zu löschen - Das aktualisierte Kontaktverzeichnis nach allen Löschvorgängen ausgeben
Verwenden Sie das folgende exakte Ausgabeformat:
Ursprüngliches Verzeichnis:
Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...Aktualisiertes Verzeichnis nach den Löschvorgängen:
Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...Falls das Verzeichnis nach allen Löschvorgängen leer ist, geben Sie Folgendes aus:
Updated Contact Directory:
Directory is emptyDie Kontakte sollten in der Reihenfolge ausgegeben werden, in der sie beim Iterieren durch die Map erscheinen (alphabetische Reihenfolge nach Kontaktname). Verwenden Sie beide Male eine bereichsbasierte for-Schleife (range-based for loop), um durch die Map zu iterieren, und greifen Sie auf jedes Schlüssel-Wert-Paar mit pair.first für den Kontaktnamen und pair.second für die Telefonnummer zu. Denken Sie daran, dass der Versuch, einen nicht existierenden Kontakt zu löschen, keinen Fehler verursacht – die Map bleibt einfach unverändert.
Probier es selbst
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Anzahl der anfänglichen Kontakte lesen
int n;
cin >> n;
// Das Kontakte-Map erstellen
map<string, string> contacts;
// Anfängliche Kontakte lesen
for (int i = 0; i < n; i++) {
string name, phone;
cin >> name >> phone;
// TODO: Kontakt zur Map hinzufügen
}
// Anfängliches Verzeichnis ausgeben
cout << "Initial Contact Directory:" << endl;
// TODO: Alle Kontakte mit einer bereichsbasierten for-Schleife ausgeben
// Anzahl der zu entfernenden Kontakte lesen
int m;
cin >> m;
// Kontakte entfernen
for (int i = 0; i < m; i++) {
string nameToRemove;
cin >> nameToRemove;
// TODO: Kontakt mit der .erase() Methode entfernen
}
// Aktualisiertes Verzeichnis ausgeben
cout << "Updated Contact Directory:" << endl;
// TODO: Verbleibende Kontakte ausgeben oder "Directory is empty", falls leer
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Pointer und Speicher
Was ist ein Pointer?AdressoperatorDereferenzierungsoperatorNull-PointerPointer und ArraysDynamischer Speicher mit 'new'Speicher freigeben mit 'delete'Zusammenfassung – Pointer-Übung4Maps (Schlüssel-Wert-Paare)
Einführung in std::mapErstellen einer MapWerte abrufen und ändernAuf Schlüssel prüfenPaare entfernenÜber eine Map iterierenZusammenfassung – Wortfrequenz2Vektoren (Dynamische Arrays)
Einführung in std::vectorEinen Vector erstellenElemente hinzufügenAuf Elemente zugreifenVector-GrößeIterieren mit einer For-SchleifeRange-based For-SchleifeElemente entfernenZusammenfassung – Vector-Operationen3Projekt: Aufgabenlisten-Tool
ProjektübersichtEine Aufgabe hinzufügen