Warning: boost::zip_iterator
and boost::combine
从 Boost 1.63.0(2016 年 12 月 26 日)开始,如果输入容器的长度不相同(可能会崩溃或迭代超出末尾),则会导致未定义的行为。
从 Boost 1.56.0(2014 年 8 月 7 日)开始,您可以use boost::combine http://www.boost.org/doc/libs/release/libs/range/doc/html/range/reference/utilities/combine.html(该函数存在于早期版本中但未记录):
#include <boost/range/combine.hpp>
#include <vector>
#include <list>
#include <string>
int main() {
std::vector<int> a {4, 5, 6};
double b[] = {7, 8, 9};
std::list<std::string> c {"a", "b", "c"};
for (auto tup : boost::combine(a, b, c, a)) { // <---
int x, w;
double y;
std::string z;
boost::tie(x, y, z, w) = tup;
printf("%d %g %s %d\n", x, y, z.c_str(), w);
}
}
这将打印
4 7 a 4
5 8 b 5
6 9 c 6
在早期版本中,您可以自己定义一个范围,如下所示:
#include <boost/iterator/zip_iterator.hpp>
#include <boost/range.hpp>
template <typename... T>
auto zip(T&&... containers) -> boost::iterator_range<boost::zip_iterator<decltype(boost::make_tuple(std::begin(containers)...))>>
{
auto zip_begin = boost::make_zip_iterator(boost::make_tuple(std::begin(containers)...));
auto zip_end = boost::make_zip_iterator(boost::make_tuple(std::end(containers)...));
return boost::make_iterator_range(zip_begin, zip_end);
}
用法是一样的。