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?
Respuesta
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".
Una solución simple preprocesada es prior
y next
de Boost.utility
. Aprovechan operator--
y operator++
pero no requieren que usted cree un temporal.
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. –
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
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). –
que funcionó –
- 1. std :: list iterator: obtener el siguiente elemento
- 2. Iterador al último elemento en std :: list
- 3. Reemplazar el objeto std :: list dado un iterador
- 4. cómo comparar con el elemento anterior en el iterador `each`?
- 5. empalme() en std :: list e invalidación de iterador
- 6. Cómo construir un iterador std :: list en el ciclo con el incremento
- 7. jQuery Carrusel. Cómo mostrar el elemento siguiente o anterior solo
- 8. fullcalendar siguiente y anterior
- 9. ¿Cómo funciona el iterador std :: map?
- 10. Examinar el siguiente elemento en el contenedor STL
- 11. ¿Cómo puedo incrementar una variable a la letra siguiente o anterior en el alfabeto?
- 12. ¿Cómo se obtiene el siguiente valor en la secuencia de coma flotante?
- 13. ¿Se puede incrementar/disminuir un bucle en más de uno?
- 14. ¿Cómo incrementar un iterador en 2?
- 15. iterador método siguiente
- 16. ¿Cómo obtener el elemento anterior?
- 17. ¿Cómo acceder al elemento anterior/siguiente mientras está en bucle?
- 18. ¿Cómo "miro" el siguiente elemento en un escáner Java?
- 19. Usando un iterador std :: string para encontrar el inicio y el final de la cadena
- 20. Obtiene el elemento/objeto donde se coloca el elemento
- 21. iterador avanzado para el std :: vector std :: advance VS operator +?
- 22. ¿Cómo seleccionar el siguiente elemento coincidente?
- 23. ¿Cómo obtener el mes anterior y el siguiente?
- 24. ¿El incremento de un iterador de entrada mutable invalida los valores del iterador anterior?
- 25. ¿Cómo calcular el siguiente día hábil anterior en Rails?
- 26. std :: list vs std :: vector iteration
- 27. ¿Puedo incrementar un iterador simplemente agregando un número?
- 28. MySQL Siguiente/Registro anterior
- 29. Obtiene el elemento ArrayList específico
- 30. Obtiene el siguiente elemento de la matriz usando el php clave
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
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
Gracias @jalf. Tu respuesta es la única respuesta completa. –