2012-05-09 20 views
19

Czy w tym przykładzie można zastąpić BOOST_FOREACH "czystym" odpowiednikiem C++ 11?Zamień BOOST_FOREACH na "czystą" wersję 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; 
    } 
} 

Kluczową cechą jest utrzymywanie parę klucz/wartość w odnośnikach do k i v.

Próbowałem:

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

i

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

Ale żaden z wahała się w oparciu o pomysły pętli wydawało się do pracy. Przypuszczalnie wahał oparty na pętli musi posiadać deklarację przed :, ponieważ nawet:

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

jest nieprawidłowy.

Najbliższym odpowiednikiem mogę znaleźć to:

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

który nie jest tak zwięzły jak wersja BOOST_FOREACH!

Czy istnieje sposób na przedstawienie tego samego w sposób zwięzły bez zwiększenia w C++ 11?

+6

nie Czy kopiowanie ciąg na każdej iteracji w pierwszym przykładzie? Czy naprawdę tego chcesz? – pmr

Odpowiedz

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

To daje taki sam efekt jak Boost makro

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