我有两个数组,如下所示:
std::array<int,6> A,B;
//Fill A with random data
//File B with random data
无论出于何种原因,我想要某种容器对象,它允许我单独访问两个向量,但也可以迭代它们的联合,允许执行如下操作:
union_container uc(A,B);
for(unioned::iterator i=uc.begin();i!=uc.end();++i)
*i+=1;
uc.first()[2]=4;
uc.second()[4]=5;
我可以自己编写这个联合类的代码,但也许已经有一个允许这个的库?
答案 0 :(得分:1)
使用Boost zip iterators是一种方法。
#include <array>
#include <functional>
#include <iostream>
#include <boost/tuple/tuple.hpp>
#include <boost/iterator/zip_iterator.hpp>
template<typename T>
using ZipIt = boost::zip_iterator< boost::tuple<T*, T*> >;
template<typename T>
using ZipRef = decltype(*ZipIt<T>());
template<typename T>
void operator+=(ZipRef<T> z, T const& v)
{
z.template get<0>() += v;
z.template get<1>() += v;
}
int main()
{
std::array<int, 6> a = { 1, 3, 5, 7, 9, 11 };
std::array<int, 6> b = { 2, 4, 6, 8, 10, 12 };
std::for_each(
boost::make_zip_iterator(boost::make_tuple(std::begin(a), std::begin(b))),
boost::make_zip_iterator(boost::make_tuple(std::end(a), std::end(b))),
[](ZipRef<int> z){ z += 1; }
);
std::copy(std::begin(a), std::end(a), std::ostream_iterator<int>(std::cout, ",")); std::cout << "\n";
std::copy(std::begin(b), std::end(b), std::ostream_iterator<int>(std::cout, ",")); std::cout << "\n";
a[2] = 4;
b[4] = 5;
}
在线output。
请注意,上面的代码并不像我想要的那样通用,因为跳转到可变参数模板和一般迭代器类型证明有点毛茸茸(留作练习!)这主要与{{ {1}}在boost::zip_iterator
周围使用一些棘手的内部立面。出于这个原因,我还在boost::tuple
的模板别名中使用了decltype
,以避免在ZipRef
lambda表达式中编写这些讨厌的类型。