如何在基于范围的情况下使用多个容器?

时间:2016-11-29 05:45:17

标签: c++ loops stl iteration auto

我有多个不同类型的容器 我想对所有容器中的所有元素执行相同的操作 通常,这涉及多个基于范围的for循环,其中包含重复的代码:

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

我可以使用库解决方案来实现这个目标吗?

1 个答案:

答案 0 :(得分:4)

您可以使用提升范围&#39; combine

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

demo

或者,range-v3的zip视图:

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

demo

或者,您可以通过困难的方式从zip迭代器中创建一个范围:

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