Se avete bisogno di iterare su una mappa, il modo più semplice è quello di utilizzare tuple, dal momento che ricevendo il corretto digitare per digitare, è problematico. Ecco come è possibile utilizzare le tuple:
std::map<int, double> my_map;
int key;
double value;
BOOST_FOREACH(boost::tie(key, value), my_map) { ... }
Solo una nota, le virgole lavorerà qui perché le parentesi sono collocati intorno chiave e valore. Il preprocessore comprende solo virgole e parentesi (e c99 richiede di comprendere anche le virgolette). Quindi, non può analizzare lo <>
in std::pair<int, double>
. Tuttavia, possiamo usare le parentesi per aiutare il preprocessore. Per esempio, se abbiamo aa funzione che restituisce un contenitore che si chiama in questo modo:
BOOST_FOREACH(int i, foo<int, int>()) { ... } //This won't compile
Quindi, possiamo mettere parentesi intorno un'espressione e aiuterà il preprocessore:
BOOST_FOREACH(int i, (foo<int, int>())) { ... } //This will compile
Tuttavia, nel caso di una mappa, non possiamo collocare la parentesi attorno alla dichiarazione (perché non è un'espressione). Quindi questo non funziona:
BOOST_FOREACH((std::pair<int, double> p), my_map) { ... } //This won't work
Perché sarà ottenere trasformato in qualcosa di simile (std::pair<int, double> p) = *it
, e che, naturalmente, non è corretta C++.Ma utilizzando una cravatta funzionerà:
BOOST_FOREACH(tie(key, value), my_map) { ... } //This will work
Abbiamo solo bisogno di dichiarare chiave e valore al di fuori del ciclo (come mostrato sopra). Inoltre, può far sì che il loop abbia nomi più significativi. È possibile scrivere key
anziché p.first
e value
anziché p.second
.
probabilmente si dovrebbe fare questo: STD :: mappa :: value_type –
anche in C++ 11; BOOST_FOREACH (auto & ref, my_map) {...} –