2012-05-09 4 views
19

¿Es posible reemplazar el BOOST_FOREACH en este ejemplo con un equivalente "puro" de C++ 11?Reemplazar BOOST_FOREACH con la 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 característica clave es mantener el par clave/valor en las referencias a k y v.

me trataron:

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

y

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

Pero ninguno de los oscilado en base a las ideas de bucle parecía funcionar. Es de suponer que la basado varió de bucle está obligado a tener una declaración ante el :, ya que incluso:

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

no es válido.

El equivalente más cercano que puedo encontrar es:

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

que no es tan sucinta como la versión BOOST_FOREACH!

¿Hay alguna manera de expresar lo mismo de manera sucinta y sin impulso en C++ 11?

+6

¿No estás copiando una cadena en cada iteración en el primer ejemplo? ¿De verdad quieres eso? – pmr

Respuesta

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

Esto produce el mismo resultado que el Boost macro

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