Heim > Artikel > Backend-Entwicklung > Wie funktioniert die bereichsbasierte Iteration mit Standardkarten in C und wie unterscheidet sich die Syntax zwischen den Versionen?
Bereichsbasierte Iteration von Standardkarten
In C 11 und höher bieten bereichsbasierte for()-Schleifen eine praktische Syntax zum Iterieren durch Container. Allerdings kann ihr Verhalten bei komplexen Datenstrukturen wie Karten verwirrend sein.
Betrachten Sie das folgende Beispiel:
<code class="cpp">std::map<foo, bar> testing = /*...initialized...*/; for (auto abc : testing) { std::cout << abc << std::endl; }
Was ist der Typ von abc in dieser Schleife? Würde es einen Foo-Schlüssel, einen Balkenwert oder einen Iterator ergeben?
Auflösung
In C 11 und C 14 iterieren bereichsbasierte Schleifen über den Schlüssel einer Karte -Wert-Paare. Der Typ von abc ist daher std::pair Um den Schlüssel und den Wert separat abzurufen, können Sie das erste und das zweite Mitglied des Paares verwenden: Beachten Sie, dass die Variablen in der Schleife normalerweise als const deklariert werden, um anzuzeigen, dass sie den Inhalt der Karte nicht ändern. C 17 und darüber hinaus In C 17 wird eine praktische Kurznotation für die bereichsbasierte Iteration von Karten eingeführt: Diese Syntax ersetzt das erste und zweite Element direkt durch Schlüssel und Wert. Dies ermöglicht einen saubereren und prägnanteren Ausdruck der Iteration über Schlüssel-Wert-Paare. Zusätzliche Überlegungen Das obige ist der detaillierte Inhalt vonWie funktioniert die bereichsbasierte Iteration mit Standardkarten in C und wie unterscheidet sich die Syntax zwischen den Versionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!<code class="cpp">for (auto abc : testing) {
std::cout << abc.first << " has value " << abc.second << std::endl;
}</code>
<code class="cpp">for (const auto& [key, value] : testing) {
std::cout << key << " has value " << value << std::endl;
}</code>
<code class="cpp">for (auto& kv : testing) {
std::cout << kv.first << " had value " << kv.second << std::endl;
kv.second = "modified"; // Modifies the map's value
}</code>