HOWTO · C++
Iterar a través de una lista en C++
Este es un tutorial fácil sobre la estructura de datos de List y cómo podemos iterar a través de la estructura de datos de List en C++.
En esta página
Para recorrer una std::list en C++, inicializa un iterador con begin(), continúa mientras sea distinto de end() e increméntalo después de procesar cada elemento. Desreferencia el iterador para leer o cambiar el valor actual. El bucle se detiene antes de end(), que marca la posición posterior al último elemento; no es un iterador al último elemento.
¿Qué es std::list en C++?
std::list es el contenedor de lista doblemente enlazada de la biblioteca estándar de C++. Sus elementos se almacenan en nodos enlazados con los nodos vecinos, por lo que no ocupan un único bloque contiguo de memoria, como sí ocurre con los elementos de un std::vector o de un array. Esta estructura permite recorrer la lista en ambas direcciones e insertar o eliminar elementos en tiempo constante si ya tienes un iterador a la posición correspondiente.
Una lista no permite el acceso directo por índice, como items[4]. Para llegar a un elemento según su posición, hay que avanzar un iterador por la lista; el tiempo necesario es proporcional a la distancia recorrida. Además del valor, cada elemento necesita espacio para almacenar sus enlaces. Elige std::list cuando te resulten útiles los iteradores estables y la inserción o eliminación en posiciones conocidas; un vector suele ser más sencillo si necesitas almacenamiento compacto o acceso frecuente por índice.
C++ también ofrece std::forward_list, un contenedor independiente de lista simplemente enlazada que solo permite avanzar. No es el mismo contenedor que std::list. Para obtener más contexto, consulta el artículo sobre listas doblemente enlazadas.
Cómo recorrer una std::list en C++
El iterador que devuelve begin() hace referencia al primer elemento. end() señala la posición justo después del último elemento, por lo que sirve como condición de salida del bucle y no se debe desreferenciar. Al incrementar el iterador, este avanza al elemento siguiente.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
#include <iostream>
#include <list>
int main() {
std::list<int> scores{12, 18, 25};
for (std::list<int>::iterator it = scores.begin(); it != scores.end(); ++it) {
std::cout << *it << '\n';
}
}
12
18
25
Aquí, it comienza en scores.begin(). En cada iteración, se lee el valor actual con *it y luego ++it avanza al nodo siguiente. Cuando el iterador llega a scores.end(), la condición es falsa y el bucle termina sin leer la posición posterior al último elemento.
Puedes modificar un elemento mediante un iterador que no sea constante asignando un valor a *it. Por ejemplo, *it += 1; dentro del cuerpo del bucle incrementa el valor actual. Usa un bucle for basado en rango si solo necesitas visitar los valores: for (int score : scores). Para modificarlos de esa forma, enlaza cada elemento mediante una referencia: for (int& score : scores). Usa el bucle explícito con iterador cuando necesites el propio iterador, por ejemplo, para eliminar el elemento actual.
Al borrar elementos durante el recorrido, asigna a la variable iteradora el iterador que devuelve erase para continuar con el siguiente elemento. El borrado invalida el iterador al elemento eliminado, mientras que los iteradores a los demás elementos de std::list siguen siendo válidos.