2011-01-17 9 views
7

Quiero inicializar un iterador (de tipo arbitrario) con el sucesor de otro iterador (del mismo tipo). El siguiente código funciona con iteradores de acceso aleatorio, pero falla con avance o iteradores bidireccionales:iterator successor

Iterator i = j + 1; 

Una solución sencilla es:

Iterator i = j; 
++i; 

Pero eso no funciona como el init-stament de un bucle for. Podría utilizar una plantilla de función como la siguiente:

template <typename Iterator> 
Iterator succ(Iterator it) 
{ 
    return ++it; 
} 

y luego usarlo como esto:

Iterator i = succ(j); 

¿Hay algo parecido en la STL o Boost, o hay una solución aún mejor me no estoy al tanto?

+1

Usted dice que 'Iterator i = j; ++ i; 'no es posible dentro de un bucle' for' - ¿puedes ampliar eso? Debería funcionar bien en un bucle 'for'. –

+0

@Michael: quise decir el lugar 'x' en' for (x; y; z) ', no dentro del propio cuerpo del bucle. – fredoverflow

+0

Veo; eso tiene sentido. –

Respuesta

14

Creo que estás buscando next in Boost.Utility. También tiene prior para obtener un iterador a un elemento anterior.

Actualización:

C++ 11 introducido std::next y std::prev.

+0

para completar, también hay 'prev' :) –

+0

@Matthiew M .: Creo que te refieres a' prior'. Está en mi enlace. Ahora agregué una mención a mi respuesta. –

+0

'next' ahora es parte de C++ 11 http://en.cppreference.com/w/cpp/iterator/next – alfC