Написание итератора, который заставляет несколько контейнеров выглядеть как один

Рассмотрим следующий упрощенный пример и желаемый результат:

class A
{
    class combined_iterator
    {
        ????
    }
    typedef ??? t_combined_it;

    t_combined_it begin();
    t_combined_it end();

    std::vector 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.

Я нашел следующий вопрос, который, как мне кажется, задает тот же самый: Создайте итератор c ++, который проходит через 2 контейнера . На этот вопрос не было хороших ответов; решение, представленное исходным запросчиком, кажется запутанным и требует (относительно) интенсивного использования памяти.

Я попробовал наивный подход, сохранив std :: vector :: iterator в качестве члена моего пользовательского итератора и сравнив его с итераторы .end () каждой из повторяемых последовательностей; однако кажется незаконным сравнивать итераторы из разных контейнеров (где я бы предпочел, чтобы они просто возвращали «не равно» - может быть, это направление для поиска решения этой проблемы?Однако я не могу придумать, как это реализовать).

Где возможно и если необходимо, я хотел бы использовать boost :: итераторы, поскольку я использую их в других местах, и мне нравится однородность, которую он обеспечивает для моих реализаций итераторов; но, конечно, если у кого-то есть идея, не используя их, я могу проработать их в себе, поэтому они не нужны в этом смысле.

20
задан Community 23 May 2017 в 12:00
поделиться