Итеративное объединение двух векторов

У меня есть два массива, как показано ниже:

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;

Я мог бы сам написать этот объединенный класс, но, возможно, уже есть библиотека, которая позволяет это?

1

Решение

С помощью Boost zip-итераторы это один из способов сделать это.

#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;
}

онлайн выход.

Обратите внимание, что приведенный выше код не такой общий, как мне бы хотелось, поскольку переход к шаблонам с переменными значениями и общим типам итераторов оказался немного сложным (оставлено в качестве упражнения!) Это связано главным образом с тем фактом, что boost::zip_iterator использует несколько хитрых внутренних фасадов boost::tuple, По этой причине я также использовал decltype в шаблоне псевдоним для ZipRef чтобы избежать необходимости писать такие неприятные типы внутри std::for_each лямбда-выражение.

1

Другие решения

Других решений пока нет …