C ++ de programación: hacer su camino a través de una lista
El programador itera a través de una matriz, proporcionando el índice de cada elemento de C ++. Sin embargo, esta técnica no funciona para contenedores como lista que no permiten el acceso aleatorio. Uno podría imaginar una solución basada en métodos como GetFirst () y getNext ()- Sin embargo, los diseñadores de la Biblioteca de plantillas estándar querían proporcionar un método común para atravesar cualquier tipo de contenedor.
Para ello, la Biblioteca de plantillas estándar define el iterador.
Un iterador es un objeto que designa a los miembros de un contenedor. En general, cada iterador admite las siguientes funciones:
Una clase puede devolver un iterador que apunta al primer elemento de la colección.
El repetidor se puede mover de un miembro a otro.
El iterador devuelve una indicación cuando se alcanza el final de la lista.
El programa puede recuperar el elemento al que apunta el iterador.
La Biblioteca de plantillas estándar también proporciona iteradores inversa para mover hacia atrás a través de listas. Todo aquí sobre iteradores se aplica igualmente para iteradores inversa.
El código necesario para iterar a través de un lista es diferente de la necesaria para atravesar una vector (por citar sólo dos ejemplos). Sin embargo, el iterador se esconde estos detalles.
El metodo comenzar() devuelve un iterador que apunta al primer elemento de una lista. La indirección operador * () recupera una referencia al objeto apuntado por el iterador. los ++ operador mueve el iterador al siguiente elemento de la lista.
Un programa continúa para incrementar su camino a través de la lista hasta el iterador es igual al valor devuelto por fin(). El siguiente fragmento de código comienza al principio de una lista de los estudiantes y muestra cada uno de sus nombres:
displayStudents void (listaestudiantes) {// asignar un iterador que apunta al primer elemento // en el listlist :: iter iterador = students.begin () - (! iter = students.end ()) // continuar para recorrer la lista hasta el // iterador golpea el extremo de la listwhile {// recuperar el estudiante los puntos iterador atStudent s = * iter-cout lt; lt; s.sName lt; lt; endl - // ahora mover el iterador al siguiente elemento // en el listiter ++ -}}
Declaraciones de iteradores puede ser muy compleja. Esta es probablemente la mejor justificación de la auto declaración introducido con la norma '11:
para la (auto iter = students.begin () - iter = students.end (!) - iter ++) {cout lt; lt; iteración> sName lt; lt; endl-}
Esto declara iter ser un iterador de cualquier tipo es devuelto por el método lista