2012-05-09 13 views
19

È possibile sostituire lo BOOST_FOREACH in questo esempio con un equivalente "puro" C++ 11?Sostituire BOOST_FOREACH con alternativa "pura" C++ 11?

#include <map> 
#include <functional> 
#include <boost/foreach.hpp> 
#include <iostream> 

int main() { 
    std::map<int, std::string> map = {std::make_pair(1,"one"), std::make_pair(2,"two")}; 
    int k; 
    std::string v; 
    BOOST_FOREACH(std::tie(k, v), map) { 
    std::cout << "k=" << k << " - " << v << std::endl; 
    } 
} 

La caratteristica chiave è mantenere la coppia chiave/valore nei riferimenti per k e v.

ho provato:

for(std::tie(k,v) : map) 
{ 
    std::cout << "k=" << k << " - " << v << std::endl; 
} 

e

auto i = std::tie(k,v); 
for(i : map) 
{ 
    std::cout << "k=" << k << " - " << v << std::endl; 
} 

Ma nessuno dei spaziato base per le idee di loop sembrava funzionare. Presumibilmente il variava in base per il ciclo deve avere una dichiarazione prima della :, dal momento che anche:

std::vector<int> test; 
int i; 
for (i : test); 

non è valido.

L'equivalente più che posso trovare è:

for (auto it = map.begin(); it!=map.end() && (std::tie(k,v)=*it,1); ++it) 
{ 
    std::cout << "k=" << k << " - " << v << std::endl; 
} 

, che non è così succinta come la versione BOOST_FOREACH!

C'è un modo per esprimere la stessa cosa in modo succinto senza aumentare in C++ 11?

+6

Non sei la copia di una stringa ad ogni iterazione nel primo esempio? Lo vuoi davvero? – pmr

risposta

24
for (auto & i : map) 
{ 
    std::tie(k,v) = i; 
    // your code here 
} 
3

Questo produce lo stesso output come il Boost macro

for(auto const& k : map) { 
    std::cout << "k = " << k.first << " - " << k.second << std::endl; 
}