2016-11-29 3 views
2

여러 종류의 컨테이너가 있습니다.
모든 컨테이너에서 모든 요소에 대해 동일한 작업을 수행하고 싶습니다.
일반적으로이 여러 중복 된 코드를 루프 범위 기반 포함 :범위 기반의 여러 컨테이너를 사용하려면 어떻게해야합니까?

#include <iostream> 
#include <vector> 
#include <set> 

int main() { 

    //containers 
    std::vector<int> v1{1,2,3,4,5}; 
    std::set<float> v2{6,7,8,9,10}; 

    //perform iterations 
    for (auto & it: v1){ 
     std::cout << it << ' '; 
    } 
    for (auto & it: v2){ 
     std::cout << it << ' '; 
    } 
} 

내가 같은 루프 범위 기반에 여러 개의 컨테이너를 제공하여
, 대신에이 작업을 수행 할 수 있도록하고 싶습니다.

물론이 작동하지 않습니다 :이를 달성하기 위해 사용할 수있는 라이브러리 솔루션

for (auto & it: v1,v2){ 
    std::cout << it << ' '; 
} 

있습니까? 당신은 사용할 수

답변

3

부스트 범위의 combine :

for(auto&& el : boost::combine(v1, v2)) { 
    std::cout << boost::get<0>(el) << ", " << boost::get<1>(el) << '\n'; 
} 

demo

또는 range-v3의 우편보기 :

for(auto&& el : view::zip(v1, v2)) { 
    std::cout << std::get<0>(el) << ", " << std::get<1>(el) << '\n'; 
} 

demo


다른 방법으로는 우편의 범위를 만들 수있는 하드 방법을 이터레이터 :

auto b = boost::make_zip_iterator(boost::make_tuple(v1.begin(), v2.begin())); 
auto e = boost::make_zip_iterator(boost::make_tuple(v1.end(), v2.end())); 
for(auto&& tup : boost::make_iterator_range(b, e)) { 
    std::cout << boost::get<0>(tup) << ", " << boost::get<1>(tup) << '\n'; 
} 

demo

+0

내가 거의 명시 적으로 _a 쉼표 연산자로 재 해석 할 수없는 규칙을 설정하는 표준에 의해 금지 있다고 말할 것이다 두 개의 init-declarators를 구분합니다. – skypjack

+0

@skypjack 귀하의 의견을 이해할 수 없다고 생각합니다. – krzaq