迭代多个seq。 C ++中的容器11

时间:2014-03-03 08:38:59

标签: c++ c++11 iterator

我需要针对以下情况提出一些建议 - 我几个小时都无法弄清楚: 如何通过多个seq。容器大小相同(这里:两个向量)的简单方法?

int main() {
  int size = 3;
  std::vector<int> v1{ 1, 2, 3 }, v2{ 6, 4, 2 };

  // old-fashioned - ok
  for (int i = 0; i < size; i++) {
    std::cout << v1[i] << " " << v2[i] << std::endl;
  }

  // would like to do the same as above with auto range-for loop
  // something like this - which would be fine for ONE vector.
  // But this does not work. Do I need a hand-made iterator instead?
  for (const auto& i:v1,v2) {
    std::cout << i << " " << i << std::endl;
  }

  return EXIT_SUCCESS;
}

谢谢!

2 个答案:

答案 0 :(得分:14)

基于范围的for循环被设计为迭代一个范围的便利,因为它是迄今为止最常见的情况。如果您需要迭代多个范围(这不是最常见的情况),您仍然可以采用传统方式:

for (auto i1 = begin(v1), i2 = begin(v2), e = end(v1); i1 != e; ++i1, ++i2)
{
  // processing
}

答案 1 :(得分:13)

Boost.Range中有boost::combine(),允许用户编写

#include <iostream>
#include <iterator>
#include <vector>
#include <boost/range/combine.hpp>

int main()
{
    std::vector<int> v1{ 1, 2, 3 }, v2{ 6, 4, 2 };

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

Live Example

如果您不想依赖于此,可以使用Boost.Iteratorcombine()Boost.Range {{1}自行拼出zip_iterator功能和一些C ++ 14推导出的返回类型:

iterator_range

Live Example

解释template<class... Ranges> auto combine(Ranges const&... ranges) // add -> decltype( boost::make_iterator_range(...) ) in C++11 { return boost::make_iterator_range( boost::make_zip_iterator(boost::make_tuple(begin(ranges)...)), boost::make_zip_iterator(boost::make_tuple(end(ranges)...)) ); } 在输入范围内创建boost::make_zip_iterator个迭代器,并重载您知道的所有常用boost::tupleoperator++并且喜欢常规的迭代器。 operator*然后将这些iterator_range中的两个包装到一个包含zip_iteratorbegin()函数的包中,该函数允许它被C ++ 11 range-for循环使用。它也推广到两个以上的输入范围。您可以使用end()成员函数从元组中解压缩K个元素。