2012-04-13 10 views
40

Supongo que tengo std::list<int> lst y algo de std::list<int>::iterator it para recorrer la lista. Y dependía del valor de it Quiero usar it + 1 o it - 1 en mi código. ¿Hay alguna buena manera de hacerlo como next(), prev() (no pude encontrar tales cosas en la documentación STL)? ¿O debería copiar el it cada vez e incrementar (disminuir) la copia?¿Cómo se obtiene el elemento siguiente (anterior) en std :: list sin incrementar (disminuir) el iterador?

+0

Cuando lo hace 'it ++', se traduce como 'it = it + 1', lo que significa técnicamente el el objeto iterador bien podría ser un objeto nuevo cada vez. No estoy seguro de lo que está pidiendo. – Neil

+3

Copiar e incrementar/disminuir la copia es la única forma en que se puede hacer. Puede escribir funciones de envoltura para ocultarlo (y como se menciona en respuestas, C++ 11 tiene 'std :: prev' /' std :: next' que hacen exactamente eso. Pero son envoltorios alrededor de esta operación de "copiar e incrementar" – jalf

+0

Gracias @jalf. Tu respuesta es la única respuesta completa. –

Respuesta

17

copia y de incrementar/decrementar la copia es la única forma en que puede hacerse.

Puede escribir funciones de envoltura para ocultarlo (y como se menciona en las respuestas, C++ 11 tiene std :: prev/std :: next que hacen precisamente eso (y Boost define funciones similares). Pero son envoltorios alrededor esta operación de "copiar e incrementar", por lo que no tiene que preocuparse porque lo está haciendo "mal".

5

Una solución simple preprocesada es prior y next de Boost.utility. Aprovechan operator-- y operator++ pero no requieren que usted cree un temporal.

+2

Por supuesto, se debe mencionar que 1. Crean el temporal por sí mismos y 2. Es mejor que tenga en cuenta las condiciones de contorno. –

39

Sí, desde C++ 11 existen los dos métodos que está buscando llamados std::prev y std::next. Puede encontrarlos en la biblioteca del iterador.

Ejemplo de cppreference.com

#include <iostream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::list<int> v{ 3, 1, 4 }; 

    auto it = v.begin(); 

    auto nx = std::next(it, 2); 

    std::cout << *it << ' ' << *nx << '\n'; 
} 

de salida:

3 4 
+4

Y por supuesto, si no tiene C++ 11, son muy fáciles de implementar. (Creo que la mayoría de nosotros los teníamos en nuestros kits de herramientas mucho antes de que fueran propuestos para C++ 11). –

+0

que funcionó –

Cuestiones relacionadas