簡體   English   中英

如何在基於范圍的容器中使用多個容器?

[英]How can I use multiple containers in a range-based for?

我有多個不同類型的容器。
我想對所有容器中的所有元素執行相同的操作。
通常,這涉及具有重復代碼的多個基於范圍的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循環。

這當然不起作用:

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

是否可以使用圖書館解決方案來實現這一目標?

您可以使用升壓范圍的combine

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

演示

或者, range-v3的zip視圖:

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

演示


另外,您也可以通過硬方法從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';
}

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM