2012-05-09 1 views
19

Можно ли заменить BOOST_FOREACH в этом примере «чистым» эквивалентом C++ 11?Замените BOOST_FOREACH на «чистую» альтернативу 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; 
    } 
} 

Ключевой особенностью является сохранение пары ключ/значение в ссылках на k и v.

Я пробовал:

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

и

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

Но ни один из колебались на основе идей цикла, похоже, не работает. Предположительно, варьировались на основе цикла должно иметь декларацию до :, так как даже:

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

не действителен.

Ближайшим эквивалентом я могу найти:

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

, который не является столь же лаконичен, как версия BOOST_FOREACH!

Есть ли способ выразить одно и то же кратко без повышения в C++ 11?

+6

Вы не копируете строку на каждой итерации в первом примере? Вы действительно этого хотите? – pmr

ответ

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

Это производит один и тот же результат, что и НЧ макро

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