C++
VeröffentlichtRevision 1

Schlüssel, Werte und Mengen: map und set

Eine Zuordnung verbindet einen Schlüssel mit einem Wert. Bei einem Telefonbuch ist der Name der Schlüssel und die Telefonnummer der Wert. std::map hält eindeutige Schlüssel nach einer Vergleichsregel geordnet. Ein assoziativer Container sucht anhand solcher Schlüssel.

Schlüssel, Werte und Mengen: map und set#

Daten sammeln und verarbeiten · Lektion 29 von 60

Voraussetzungen: Vector, Strings. Lernziel: Du findest Werte über Namen statt über Positionsnummern.

Eine Zuordnung verbindet einen Schlüssel mit einem Wert. Bei einem Telefonbuch ist der Name der Schlüssel und die Telefonnummer der Wert. std::map hält eindeutige Schlüssel nach einer Vergleichsregel geordnet. Ein assoziativer Container sucht anhand solcher Schlüssel.

C++
1#include <iostream>2#include <map>3#include <string>4 5int main() {6    std::map<std::string, int> punkte;7    punkte["Ada"] = 12;8    punkte["Linus"] = 9;9    const auto treffer = punkte.find("Ada");10    if (treffer != punkte.end()) {11        std::cout << treffer->first << ": " << treffer->second << '\n';12    }13    for (const auto& [name, anzahl] : punkte) {14        std::cout << name << ' ' << anzahl << '\n';15    }16}

find liefert einen Iterator, ein Positionsobjekt für die Sammlung. end() markiert die Position hinter dem Ende und bedeutet hier „nicht gefunden“. -> greift über dieses Positionsobjekt auf den Eintrag zu; first ist der Schlüssel, second der Wert. Die genaue Iteratorbedeutung folgt als Nächstes.

[name, anzahl] ist eine strukturierte Bindung aus C++17. Sie gibt den beiden Teilen eines Eintrags verständliche Namen. const auto& vermeidet eine Kopie und erlaubt hier keine Änderung über die Bindung.

Lesen kann versehentlich schreiben#

punkte["Unbekannt"] legt einen fehlenden Schlüssel an und initialisiert dessen int-Wert mit null. Verwende find, wenn du nur nachsehen möchtest. at verlangt einen vorhandenen Schlüssel und wirft sonst eine Ausnahme. Ein häufiger logischer Fehler entsteht, wenn eine reine Existenzprüfung mit [] plötzlich die Sammlung vergrößert.

map, unordered_map und set#

std::unordered_map aus <unordered_map> verwendet eine Hashtabelle. Eine Hashfunktion berechnet aus dem Schlüssel einen Wert für die interne Zuordnung. Zugriffe sind im Durchschnitt konstant schnell; ungünstige Verteilungen können sie verschlechtern. Die Iterationsreihenfolge ist nicht als sortierte Reihenfolge festgelegt.

std::set enthält eindeutige Schlüssel ohne zusätzlichen zugeordneten Wert. Das passt beispielsweise zu einer Menge bereits gesehener Benutzernamen. Eine Menge enthält jeden Wert höchstens einmal.

Übung#

Wie prüfst du in C++17, ob Ada vorhanden ist, ohne etwas anzulegen?

Lösung

punkte.find("Ada") != punkte.end(). C++20 bietet bei entsprechenden Containern zusätzlich contains, das in der C++17-Basis noch nicht verfügbar ist.

Weiterlernen#

Zurück: Feste Arrays, C-Arrays und std::span · Kursübersicht · Weiter: Iteratoren und gültige Bereiche

Mitwirkende 1

Menschen, deren Änderungen in dieser Seite veröffentlicht wurden.

Kommentare 0

Kommentare sind für diese Seite deaktiviert.