consideremos el siguiente ejemplo simplificado y salida deseada:Escribir un iterador que hace que varios contenedores se ven como uno
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 << " ";
}
Salida:
1 2
Creo que la pregunta se desprende de esto: ¿cómo hacer yo escribe un iterador que hace que parezca que dos o más iteradores son en realidad una sola secuencia. De modo que, en el ejemplo, en lugar de la iteración sobre m_Vec1 y m_Vec2, puedo usar un iterador que repite primero los elementos de m_Vec1 y luego m_Vec2, de forma transparente.
Encontré la siguiente pregunta que creo que pregunta lo mismo: Make a c++ iterator that traverses 2 containers. No hubo buenas respuestas a esta pregunta; la solución presentada por el asker original parece intrincada, y es (relativamente) intensiva en memoria.
Intenté un enfoque ingenuo manteniendo un std :: vector :: iterator como miembro de mi iterador personalizado, y comparándolo con los iteradores .end() de cada una de las secuencias que se están iterando; sin embargo, parece que es ilegal comparar iteradores de diferentes contenedores (donde hubiera preferido que simplemente regresaran "no iguales", tal vez esa sea una dirección para encontrar la solución a este problema). No puedo pensar cómo para implementarlo, sin embargo).
Siempre que sea posible, me gustaría utilizar boost :: iterators como los uso en otro lugar y me gusta la homogeneidad que proporciona a las implementaciones de mi iterador; pero, por supuesto, si alguien tiene una idea sin usarla, puedo trabajarla en mí mismo, por lo que no se requiere en ese sentido.
Gracias, exactamente lo que estaba buscando. Nunca se me ocurrió que esto sería en boost :: range, aunque en retrospectiva tiene sentido. – Roel