Menu
Coddy logo textTech

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 95

Dieselbe Syntax funktioniert auch zum Aktualisieren bestehender Werte:

scores["Alice"] = 98; // Aktualisiert Alices Punktzahl auf 98

Hier 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 0

Diese 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.

challenge icon

Aufgabe

Einfach

Erstellen 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 n Paare 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:

  1. Eine std::map<std::string, int> namens inventory erstellen
  2. Die Anzahl der anfänglichen Produkte einlesen
  3. Für jedes Produkt den Namen und die Lagerbestandsmenge einlesen und diese dann mit der eckigen Klammernotation zur Map hinzufügen
  4. Das anfängliche Inventar in dem unten gezeigten Format ausgeben
  5. Den Produktnamen und die neue Menge zur Aktualisierung einlesen
  6. Den eckigen Klammeroperator verwenden, um die Lagerbestandsmenge für das angegebene Produkt zu aktualisieren
  7. 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 aktualisieren

Wenn 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 0

Verwenden 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;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablauf