Paare entfernen
Teil des Abschnitts Logik & Ablauf der C++-Journey von Coddy. Lektion 27 von 56.
Manchmal musst du Schlüssel-Wert-Paare aus deiner map entfernen, wenn sie nicht mehr benötigt werden. Die Methode .erase() bietet eine unkomplizierte Möglichkeit, Elemente zu löschen, indem du den zu entfernenden Schlüssel angibst.
Um ein Element aus einer Map zu entfernen, rufe 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 Punktzahlen von Alice und Carol enthalten. Wenn du versuchst, einen Schlüssel zu löschen, der in der Map nicht vorhanden ist, geschieht bei der Operation einfach nichts – es tritt kein Fehler auf.
Beim Durchlaufen einer map mit einer for-Schleife auf Basis eines Bereichs ist jedes Element ein std::pair, das den Schlüssel und den Wert enthält. Du kannst 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.
Diese Methode ist besonders nützlich, um saubere Datenstrukturen zu pflegen, veraltete Informationen zu entfernen oder Funktionen zu implementieren, mit denen Benutzer Einträge aus deiner Anwendung löschen können.
Aufgabe
EinfachErstelle ein Programm, das ein Kontaktverzeichnis mithilfe einer std::map verwaltet. Dein Programm speichert Kontaktnamen und Telefonnummern und ermöglicht es den Benutzern anschließend, bestimmte Kontakte mithilfe der Methode .erase() aus dem Verzeichnis zu entfernen.
Die folgenden Eingaben werden bereitgestellt:
- Eine Ganzzahl
n, die die Anzahl der anfänglichen Kontakte angibt - Anschließend
nEingabepaare:- Eine Zeichenkette für den Kontaktnamen
- Eine Zeichenkette für die Telefonnummer
- Eine Ganzzahl
m, die die Anzahl der zu entfernenden Kontakte angibt - Anschließend
mZeichenketten mit den zu entfernenden Kontaktnamen
Dein 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 anfä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 entfernen - Das aktualisierte Kontaktverzeichnis nach allen Entfernungen ausgeben
Verwende das folgende exakte Ausgabeformat:
Anfängliches Verzeichnis:
Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...Aktualisiertes Verzeichnis nach den Entfernungen:
Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...Wenn das Verzeichnis nach allen Entfernungen leer ist, gib Folgendes aus:
Updated Contact Directory:
Directory is emptyDie Kontakte sollten in der Reihenfolge ausgegeben werden, in der sie beim Durchlaufen der Map erscheinen (alphabetische Reihenfolge nach Kontaktnamen). Verwende beide Male eine range-basierte for-Schleife, um die Map zu durchlaufen, und greife mit pair.first auf das Schlüssel-Wert-Paar für den Kontaktnamen und mit pair.second auf die Telefonnummer zu. Denke daran, dass der Versuch, einen nicht vorhandenen 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() {
// Read number of initial contacts
int n;
cin >> n;
// Erstelle die contacts-Map
map<string, string> contacts;
// Read initial contacts
for (int i = 0; i < n; i++) {
string name, phone;
cin >> name >> phone;
// TODO: Füge Kontakt zur Map hinzu
}
// Gib das initiale Verzeichnis aus
cout << "Initial Contact Directory:" << endl;
// TODO: Gib alle Kontakte mit range-basierter for-Schleife aus
// Lies die Anzahl der zu entfernenden Kontakte
int m;
cin >> m;
// Entferne Kontakte
for (int i = 0; i < m; i++) {
string nameToRemove;
cin >> nameToRemove;
// TODO: Entferne Kontakt mit der .erase()-Methode
}
// Gib das aktualisierte Verzeichnis aus
cout << "Updated Contact Directory:" << endl;
// TODO: Print remaining contacts or "Directory is empty" if empty
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Übe selbstständig: Online-C++-Compiler