Wie kann ich eine std::map
in C ++ durchlaufen ? Meine Karte ist definiert als:
std::map< std::string, std::map<std::string, std::string> >
Der obige Container enthält beispielsweise Daten wie folgt:
m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";
Wie kann ich diese Karte durchlaufen und auf die verschiedenen Werte zugreifen?
Antworten:
Alte Frage, aber die restlichen Antworten sind ab C ++ 11 veraltet. Sie können eine for-basierte for-Schleife verwenden und einfach Folgendes tun:
Dies sollte viel sauberer sein als die früheren Versionen und vermeidet unnötige Kopien.
Einige bevorzugen es, die Kommentare durch explizite Definitionen von Referenzvariablen zu ersetzen (die bei Nichtverwendung optimiert werden):
quelle
const
nachauto
? Ist es rein ästhetisch?int const *x
undint *const x
Sie können es so schreiben, dass esint const *const x
IMO viel klarer ist alsconst int *const x
. Aber es wird nur von links nach rechts analysiert, damit der Effekt der gleiche ist. Siehe die Antworten auf diese Frage: stackoverflow.com/questions/5503352/const-before-or-const-afterSie können einen Iterator verwenden.
quelle
for(auto iterator = m.begin(); iterator != m.end(); iterator++)
oder schöner in C ++ 0x:
quelle
Mit C ++ 17 (oder höher) können Sie die Funktion "Strukturierte Bindungen" verwenden, mit der Sie mehrere Variablen mit unterschiedlichen Namen mit einem einzigen Tupel / Paar definieren können. Beispiel:
Der ursprüngliche Vorschlag (von den Größen Bjarne Stroustrup, Herb Sutter und Gabriel Dos Reis) macht Spaß zu lesen (und die vorgeschlagene Syntax ist meiner Meinung nach intuitiver); Es gibt auch den vorgeschlagenen Wortlaut für den Standard der langweilig zu lesen ist, aber näher an dem liegt, was tatsächlich hineingehen wird.
quelle
Mach so etwas:
quelle
C ++ 11:
Ausgabe:
quelle
verwenden,
std::map< std::string, std::map<std::string, std::string> >::const_iterator
wenn map const ist.quelle
auto
Bruder, oder wer Vim benutzt, wird KO.Wie einpoklum in erwähnt ihre Antwort , da C ++ 17 können Sie auch Erklärungen verbindlich strukturiert . Ich möchte das erweitern, indem ich eine vollständige Lösung für das bequeme Durchlaufen einer Kartenkarte bereitstelle:
Hinweis 1: Zum Ausfüllen der Karte habe ich eine Initialisierungsliste verwendet (eine C ++ 11- Funktion). Dies kann manchmal nützlich sein, um feste Initialisierungen kompakt zu halten.
Hinweis 2: Wenn Sie die Karte
m
innerhalb der Schleifen ändern möchten , müssen Sie dieconst
Schlüsselwörter entfernen .Code auf Coliru
quelle
Die erste Lösung lautet Verwenden Sie range_based for loop wie:
Hinweis: Wenn
range_expression
‚s - Typ iststd::map
dann einrange_declaration
‘ s - Typ iststd::pair
.Code 1:
Die zweite Lösung:
Code 2
quelle