Werte abrufen und ändern
Teil des Abschnitts Logik & Ablauf der C++-Journey von Coddy — Lektion 25 von 56.
Sobald Sie eine Map mit Schlüssel-Wert-Paaren haben, müssen Sie häufig die darin gespeicherten Werte abrufen oder aktualisieren. Der eckige Klammer-Operator [] bietet eine bequeme Möglichkeit, sowohl auf vorhandene Werte zuzugreifen als auch diese zu ändern.
Um auf einen Wert zuzugreifen, verwenden Sie einfach den Schlüssel in eckigen Klammern:
std::map<std::string, int> scores;
scores["Alice"] = 95;
int aliceScore = scores["Alice"]; // Erhält 95Dieselbe Syntax funktioniert auch zum Aktualisieren bestehender Werte:
scores["Alice"] = 98; // Aktualisiert Alices Punktzahl auf 98Hier ist ein wichtiges Verhalten, das man sich merken sollte: Wenn Sie den []-Operator mit einem Schlüssel verwenden, der in der Map nicht existiert, erstellt er automatisch ein neues Element mit diesem Schlüssel und initialisiert es mit einem Standardwert (0 für Integer, leerer String für Strings usw.).
int bobScore = scores["Bob"]; // Erzeugt "Bob" mit dem Wert 0Diese Funktion zur automatischen Erstellung macht den []-Operator sowohl für das Lesen als auch für das Schreiben von Map-Daten sehr praktisch, da Sie nicht prüfen müssen, ob ein Schlüssel existiert, bevor Sie ihn verwenden.
Sie können auch mit einer bereichsbasierten for-Schleife durch alle Schlüssel-Wert-Paare in einer Map iterieren. Jedes Element in der Map ist ein pair, wobei pair.first den Schlüssel und pair.second den Wert enthält:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Dies gibt jedes in der Map gespeicherte Schlüssel-Wert-Paar aus, eines pro Zeile.
Aufgabe
EinfachErstellen Sie ein Programm, das ein Produktinventarsystem mit einer std::map verwaltet. Ihr Programm wird Produktnamen und deren aktuelle Lagerbestände verfolgen, sodass Sie auf die Inventarbestände zugreifen und diese aktualisieren können.
Die folgenden Eingaben werden bereitgestellt:
- Ein Integer
n, der die Anzahl der anfänglichen Produkte darstellt - Anschließend
nPaare von Eingaben:- Ein String, der den Produktnamen darstellt
- Ein Integer, der die anfängliche Lagerbestandsmenge darstellt
- Ein String, der einen zu aktualisierenden Produktnamen darstellt
- Ein Integer, der die neue Lagerbestandsmenge für dieses Produkt darstellt
Ihr Programm sollte:
- Eine
std::map<std::string, int>namensinventoryerstellen - Die Anzahl der anfänglichen Produkte einlesen
- Für jedes Produkt den Namen und die Lagerbestandsmenge einlesen und diese dann mit der eckigen Klammernotation zur Map hinzufügen
- Das anfängliche Inventar in dem unten gezeigten Format ausgeben
- Den Produktnamen und die neue Menge zur Aktualisierung einlesen
- Den eckigen Klammeroperator verwenden, um die Lagerbestandsmenge für das angegebene Produkt zu aktualisieren
- Das aktualisierte Inventar ausgeben, das den geänderten Lagerbestand anzeigt
Verwenden Sie das folgende exakte Ausgabeformat:
Initial Inventory:
[product1]: [quantity1]
[product2]: [quantity2]
[product3]: [quantity3]
...
Updated Inventory:
[product1]: [quantity1]
[product2]: [updated_quantity2]
[product3]: [quantity3]
...Die Produkte sollten in der Reihenfolge ausgegeben werden, in der sie beim Iterieren durch die Map erscheinen (alphabetische Reihenfolge nach Produktname). 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 Produktnamen und pair.second für die Menge zu. Wenn der zu aktualisierende Produktname nicht in der Map existiert, erstellt der eckige Klammeroperator automatisch einen neuen Eintrag mit diesem Namen und der angegebenen Menge.
Spickzettel
Verwenden Sie den eckigen Klammer-Operator [], um auf Map-Werte zuzugreifen und diese zu ändern:
std::map<std::string, int> scores;
scores["Alice"] = 95; // Wert setzen
int aliceScore = scores["Alice"]; // Wert abrufen
scores["Alice"] = 98; // Wert aktualisierenWenn Sie [] mit einem Schlüssel verwenden, der nicht existiert, wird automatisch ein neues Element mit einem Standardwert erstellt:
int bobScore = scores["Bob"]; // Erstellt "Bob" mit dem Wert 0Verwenden Sie eine bereichsbasierte for-Schleife, um alle Schlüssel-Wert-Paare zu durchlaufen. Jedes Paar hat .first für den Schlüssel und .second für den Wert:
for (auto pair : scores) {
// pair.first = Schlüssel (z. B. "Alice")
// pair.second = Wert (z. B. 98)
}Probier es selbst
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Lies die Anzahl der anfänglichen Produkte
int n;
cin >> n;
// Erstelle das Inventar-Map
map<string, int> inventory;
// Lies die anfänglichen Produkte und Mengen ein
for (int i = 0; i < n; i++) {
string product;
int quantity;
cin >> product >> quantity;
// TODO: Füge das Produkt zum Inventar-Map hinzu
}
// TODO: Gib das anfängliche Inventar aus
// Lies das zu aktualisierende Produkt und die neue Menge ein
string updateProduct;
int newQuantity;
cin >> updateProduct >> newQuantity;
// TODO: Aktualisiere die Produktmenge im Map
// TODO: Gib das aktualisierte Inventar aus
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