Das gängige Beispiel für bereichsbasierte for () - Schleifen in C ++ 11 ist immer so einfach:
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
std::cout << xyz << std::endl;
}
In welchem Fall xyz
ist ein int
. Aber was passiert, wenn wir so etwas wie eine Karte haben? Was ist der Typ der Variablen in diesem Beispiel:
std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
std::cout << abc << std::endl; // ? should this give a foo? a bar?
std::cout << abc->first << std::endl; // ? or is abc an iterator?
}
Wenn der zu durchlaufende Container etwas Einfaches ist, sieht es so aus, als würden bereichsbasierte for () -Schleifen uns jedes Element geben, keinen Iterator. Was schön ist ... wenn es ein Iterator wäre, müssten wir es immer als erstes dereferenzieren.
Aber ich bin verwirrt, was mich erwartet, wenn es um Dinge wie Karten und Multimaps geht.
(Ich bin immer noch auf g ++ 4.4, während bereichsbasierte Schleifen in g ++ 4.6+ sind, also hatte ich noch keine Gelegenheit, es zu versuchen.)
c++
c++11
for-loop
dictionary
Stéphane
quelle
quelle
std::begin
undstd::end
Funktionen oder Mitgliedsfunktionen unter demselben Namen durch.Antworten:
Jedes Element des Containers ist ein
map<K, V>::value_type
, was eintypedef
für iststd::pair<const K, V>
. Folglich können Sie in C ++ 17 oder höher schreibenoder als
Wenn Sie nicht vorhaben, die Werte zu ändern.
In C ++ 11 und C ++ 14 können Sie erweiterte
for
Schleifen verwenden, um jedes Paar einzeln zu extrahieren und anschließend die Schlüssel und Werte manuell zu extrahieren:Sie können die
kv
Variable auch markieren ,const
wenn Sie eine schreibgeschützte Ansicht der Werte wünschen.quelle
In C ++ 17 wird dies als strukturierte Bindung bezeichnet , was Folgendes ermöglicht:
quelle
const &
zum Schlüssel zu bekommen , aber einen nicht konstanten Verweis auf den Wert? (weil das ist, was map :: value_type macht ...)k
ist,const
wenn Sie verwendenfor(auto&[k,v]:testing)
Aus diesem Artikel: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2049.pdf
for( type-specifier-seq simple-declarator : expression ) statement
ist syntaktisch äquivalent zu
So können Sie deutlich sehen, was
abc
in Ihrem Fall sein wirdstd::pair<key_type, value_type >
. So zum Drucken Sie können jedes Element Zugriff tun durchabc.first
undabc.second
quelle
Wenn Sie nur die Schlüssel / Werte auf Ihrer Karte sehen möchten und Boost verwenden möchten, können Sie die Boost-Adapter mit den bereichsbasierten Schleifen verwenden:
Es gibt einen äquivalenten boost :: adapters :: key_values
http://www.boost.org/doc/libs/1_51_0/libs/range/doc/html/range/reference/adaptors/reference/map_values.html
quelle
Wenn der Kopierzuweisungsoperator von foo und bar billig ist (z. B. int, char, pointer usw.), können Sie Folgendes tun:
quelle