Рассмотрим следующий упрощенный пример и желаемый результат:
class A
{
class combined_iterator
{
????
}
typedef ??? t_combined_it;
t_combined_it begin();
t_combined_it end();
std::vector<int> m_Vec1, m_Vect2;
}
A a;
a.m_Vec1.push_back(1);
a.m_Vec2.push_back(2);
for (A::t_combined_it it = a.begin() ; it != a.end() ; it++) {
std::cout << *it << " ";
}
Вывод:
1 2
Я думаю, что вопрос ясно из этого: как написать итератор, который заставляет его выглядеть так, как если бы два или более других итератора действительно были только одной последовательностью. Таким образом, в примере вместо итерации по m_Vec1 и m_Vec2 я могу использовать итератор, который сначала выполняет итерацию элементов m_Vec1, а затем m_Vec2.
Я нашел следующий вопрос, который, я думаю, спрашивает то же самое: Создайте итератор С++, который пересекает 2 контейнера. Хороших ответов на этот вопрос не было; решение, представленное исходным аскером, кажется запутанным, и оно (относительно) интенсивно используется в памяти.
Я попробовал наивный подход, сохранив std::vector:: iterator как член моего пользовательского итератора и сравнивая его с итераторами .end() каждой из последовательно повторяющихся последовательностей; однако кажется, что сравнивать итераторы с разными контейнерами нецелесообразно (где я бы предпочел, чтобы они просто возвращали "не равно" - может быть, это направление поиска решения этой проблемы? Я не могу придумать, как для его реализации, хотя).
По возможности и, если необходимо, я хотел бы использовать boost:: iterators, поскольку я использую их в другом месте, и мне нравится однородность, которую он предоставляет моим реализациям итератора; но, конечно, если у кого-то есть идея, не используя их, я могу работать с ними в себе, поэтому они не требуются в этом смысле.