2011-04-07 26 views
11

Estoy intentando acceder al elemento repetido anteriormente en un bucle que pasa por todos los elementos de una lista.¿Cómo acceder al elemento 'anterior' en un bucle de iterador de lista C++?

Para ser más específicos, mi bucle se ve así:

for (iter=list_object.begin(); iter!= list_object_.end(); iter++) 
    { 
    function_1(*iter); 
    function_2(*PREVIOUS_VALUE_IN_THE_LIST); 
    } 

¿Cómo accedo a este valor anterior en la lista?

+0

¡Cuidado con la primera vuelta del ciclo! –

Respuesta

17

std::list es bidireccionalmente iterable, por lo que solo puede mover el iterador una posición a la vez. Lo tanto es necesario crear un nuevo iterador:

iter_copy = iter; 
--iter; 

Obviamente, usted es responsable de asegurar que un elemento anterior existe realmente antes de disminuir el iterador.

En C++ 0x, esta funcionalidad está perfectamente definida en la función std::prev, que su implementación de la biblioteca estándar de C++ puede admitir. Si no, se ve algo como esto:

template <typename BidiIt> 
BidiIt prev(BidiIt x, typename std::iterator_traits<BidiIt>::difference_type n=1) 
{ 
    std::advance(x, -n); 
    return x; 
} 
+0

Perfecto, gracias! –

2

Hay dos posibilidades. O bien --itor o std::advance(itor, -1).

12

Una manera fácil es simplemente para no perder de vista el elemento anterior en el bucle, tales como:

for(list_t::iterator iter=obj.begin(), prev=obj.end(); 
    iter != obj.end(); prev=iter, ++iter) 
{ 
    function_1(*iter); 
    if(prev != obj.end()) 
    function_2(*prev) 
} 

Esto funciona con iteradores que están simplemente Reenviar, no necesitan ser bidireccional.

+1

¡Elegancia en sí! –

+0

¡Qué respuesta tan inteligente! ¡Cubrí el caso base sin que siquiera me diera cuenta! – nirvanaswap

Cuestiones relacionadas