2016-11-29 4 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 << ' '; 
    } 
} 

Iは同じループのための範囲をベースに複数の容器を提供することによって
、代わりにこれを行うことができるようにしたいと思います。当然の

これは動作しません:

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コンマ演算子は次のように再解釈することができないためのルールを設定し、標準によって禁止されますことを言及う2つのinit-declaratorsを区切ります。 – skypjack

+0

@skypjack私はあなたのコメントを理解するとは思わない。 – krzaq

関連する問題