Ist es möglich boost :: foreach mit std :: map zu verwenden?
Finde ich boost::foreach sehr nützlich, da es spart mir eine Menge schreiben. Zum Beispiel, sagen wir, ich will zu drucken, die alle Elemente in einer Liste:
std::list<int> numbers = { 1, 2, 3, 4 };
for (std::list<int>::iterator i = numbers.begin(); i != numbers.end(); ++i)
cout << *i << " ";
boost::foreach macht der code oben auch viel einfacher:
std::list<int> numbers = { 1, 2, 3, 4 };
BOOST_FOREACH (int i, numbers)
cout << i << " ";
Viel besser! Allerdings habe ich nie herausgefunden, eine Möglichkeit (wenn es überhaupt möglich ist), um es für std::map
s. Die Dokumentation hat nur Beispiele mit Typen wie vector
oder string
.
InformationsquelleAutor der Frage Andreas Bonini | 2010-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie verwenden:
Der Grund dafür ist, dass das makro erwartet zwei Parameter. Wenn Sie versuchen, inline-pair-definition, Einführung einer zweiten Komma, so dass das makro drei Parameter statt. Der Präprozessor nicht respektiert alle C++ - Konstrukte, es kennt nur text.
So, wenn Sie sagen
BOOST_FOREACH(pair<int, int>, map)
der Präprozessor sieht diese drei Argumente für das makro:1.
pair<int
2.
int>
3.
map
Falsch ist. Dies ist erwähnt in der for-each-Dokumentation.
InformationsquelleAutor der Antwort GManNickG
Benutze ich Boost-Bereich Ex-Bibliothekdie sich um einige ausgefallene Auswahl Adapter für die Iteration über Karte, Schlüssel oder Werte. Zum Beispiel:
InformationsquelleAutor der Antwort Manuel
Sicher, Sie können. Der trick ist jedoch, dass ein map-iterator zeigt auf ein paar von Schlüssel und Wert. Es würde in etwa so Aussehen:
InformationsquelleAutor der Antwort Fred Larson
Es ist möglich, aber es ist nicht wirklich der beste Weg, Dinge zu tun (wie ich bereits erwähnt habe, ein paar mal vor, for_each fast nie ist, und BOOST_FOREACH ist nur marginal besser). Für Ihr erstes Beispiel, ich glaube, Sie wäre besser dran mit:
Es funktioniert ziemlich ähnlich wie eine Landkarte, mit der Ausnahme, dass Sie zum definieren der operator<< für das es, da es nicht bereits definiert:
...und wieder einmal
std::copy
ist der job ganz schön:InformationsquelleAutor der Antwort Jerry Coffin
Typedefing eine Karte-pair-Mädchen ist verwirrend. Der einfachste Weg zum Durchlaufen einer Karte ist mit einem Tupel(wie in python):
Und keine Sorge, solche Kommas nicht zu verwechseln den Präprozessor, weil ich Klammern gesetzt um Sie herum.
InformationsquelleAutor der Antwort Paul Fultz II
Ich mochte die Idee nicht gezwungen werden, zum hinzufügen von Typdefinitionen jedes mal wollte ich mit einer foreach auf eine Karte. So, hier ist meine Umsetzung basiert auf der boost foreach-code:
Dann können Sie es verwenden in Ihrem code:
#define foreach_in_map MUNZEKONZA_FOREACH_IN_MAP
Können Sie auch ändern Sie die Werte:
#define foreach_in_map MUNZEKONZA_FOREACH_IN_MAP
InformationsquelleAutor der Antwort marko.ristin
Ja:
InformationsquelleAutor der Antwort Martin York
In C++0x " können Sie sich leichter tun:
InformationsquelleAutor der Antwort Andreas Bonini