Wenn Sie eine Karte iterieren müssen, ist der einfachste Weg Tupeln zu verwenden, da die richtige bekommen type, um typef zu schreiben, ist mühsam. Hier ist, wie Sie Tupeln verwenden können:
std::map<int, double> my_map;
int key;
double value;
BOOST_FOREACH(boost::tie(key, value), my_map) { ... }
Nur eine Notiz, werden die Kommas hier arbeiten, weil Klammern um Schlüssel und Wert gesetzt werden. Der Präprozessor versteht nur Kommas und Klammern (und c99 erfordert, dass auch Anführungszeichen verstanden werden). So kann es die <>
in std::pair<int, double>
nicht analysieren. Wir können jedoch Klammern verwenden, um dem Präprozessor zu helfen. Zum Beispiel, wenn wir aa Funktion haben, die einen Behälter gibt, der so genannt wird:
BOOST_FOREACH(int i, foo<int, int>()) { ... } //This won't compile
So können wir Klammern um einen Ausdruck platzieren und es wird den Präprozessor helfen:
BOOST_FOREACH(int i, (foo<int, int>())) { ... } //This will compile
jedoch Im Fall einer Map können wir keine Klammern um die Deklaration platzieren (weil es kein Ausdruck ist). So wird dies nicht funktionieren:
BOOST_FOREACH((std::pair<int, double> p), my_map) { ... } //This won't work
Weil es in so etwas wie diese (std::pair<int, double> p) = *it
bekommt umgewandelt wird, und das ist natürlich falsch ist C++.Aber die Verwendung einer Krawatte funktioniert:
Wir müssen nur Schlüssel und Wert außerhalb der Schleife (wie oben gezeigt) zu deklarieren. Außerdem kann die Schleife aussagekräftigere Namen haben. Sie können key
anstelle von p.first
und value
anstelle von p.second
schreiben.
Sie wahrscheinlich, dass machen sollte tun: std :: map :: value_type –
auch in C++ 11; BOOST_FOREACH (auto & ref, my_map) {...} –