2012-05-09 3 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; 
    } 
} 

kv에 대한 참조에 한 쌍의 키/값을 유지하고있는 주요 기능.

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); 

이 유효하지 않습니다. 내가 찾을 수

가장 가까운 동등한은 다음과 같습니다 BOOST_FOREACH 버전과 확실히 간결하지

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

!

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; 
}