我需要针对以下情况提出一些建议 - 我几个小时都无法弄清楚: 如何通过多个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;
}
谢谢!
答案 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";
}
如果您不想依赖于此,可以使用Boost.Iterator的combine()
和Boost.Range {{1}自行拼出zip_iterator
功能和一些C ++ 14推导出的返回类型:
iterator_range
解释: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::tuple
和operator++
并且喜欢常规的迭代器。 operator*
然后将这些iterator_range
中的两个包装到一个包含zip_iterator
和begin()
函数的包中,该函数允许它被C ++ 11 range-for循环使用。它也推广到两个以上的输入范围。您可以使用end()
成员函数从元组中解压缩K
个元素。