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"]; // Ergibt 95Dieselbe Syntax funktioniert auch zum Aktualisieren vorhandener 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 nicht in der Map 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 Paar, 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 den Namen eines zu aktualisierenden Produkts 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 Operator für eckige Klammern 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 Operator für eckige Klammern automatisch einen neuen Eintrag mit diesem Namen und der angegebenen Menge.
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
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
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