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.
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
Kommentare 0
Kommentare sind für diese Seite deaktiviert.