Un iterador no es el mismo que el propio recipiente. El iterador se refiere a un solo elemento en el contenedor, y también proporciona formas de llegar a otros elementos.
considerar el diseño de su propio contenedor sin iteradores. Podría tener una función size
para obtener el número de elementos que contiene, y podría sobrecargar el operador []
para permitirle obtener o establecer un elemento por su posición.
Pero "acceso aleatorio" de este tipo no es fácil de implementar de manera eficiente en algunos tipos de envase. Si obtiene el elemento número mil millones: c[1000000]
y el contenedor utiliza internamente una lista vinculada, deberá escanear un millón de elementos para encontrar el que desea.
En su lugar, puede decidir permitir que la colección recuerde un elemento "actual". Podría tener funciones como start
y more
y next
que le permiten colocar a través de los contenidos:
c.start();
while (c.more())
{
item_t item = c.next();
// use the item somehow
}
Pero esto pone el "iteración estado" dentro del contenedor. Esta es una seria limitación. ¿Qué pasa si quiere comparar cada artículo en el contenedor con cada otro artículo? Eso requiere dos bucles anidados, ambos iterando a través de todos los elementos. Si el contenedor almacena la posición de la iteración, no tiene forma de anidar dos de esas iteraciones: el bucle interno destruirá el funcionamiento del bucle externo.
Por lo tanto, los iteradores son una copia independiente de un estado de iteración. Usted puede comenzar una iteración:
container_t::iterator i = c.begin();
Eso iterador, i
, es un objeto independiente que representa una posición dentro del contenedor. Se puede recuperar todo lo que se almacena en esa posición:
item_t item = *i;
se puede pasar al siguiente tema:
i++;
Con algunos iteradores puede saltar hacia adelante varios artículos:
i += 1000;
O obtener un artículo en alguna posición relativa a la posición identificada por el iterador:
item_t item = i[1000];
Y con algunos iteradores puede retroceder.
Y se puede descubrir si ha llegado más allá de los contenidos del contenedor mediante la comparación del iterador a end
:
while (i != c.end())
que se pueda imaginar end
como devolver un iterador que representa una posición que es uno más allá la última posición en el contenedor.
Un punto importante a tener en cuenta con los iteradores (y en C++ en general) es que pueden dejar de ser válidos. Esto generalmente ocurre, por ejemplo, si vacía un contenedor: los iteradores que apuntan a las posiciones en ese contenedor ahora se han vuelto inválidos. En ese estado, la mayoría de las operaciones en ellos no están definidas, ¡podría pasar cualquier cosa!
+1 buena explicación. – Nawaz