Iteradores
Las funciones de STL utilizan mucho de iteradores de mediar entre los algoritmos diferentes y secuencias sobre los que representar.El nombre de un tipo de iterador (o su prefijo) indica la categoría de iteradores necesarios para ese tipo.En orden de aumentar la eficacia, las categorías se resumen aquí como:
Salida.Un iterador X de salida solo puede tener un indirecto almacenada V en él, después del cual debe incrementar antes de que el almacén siguiente, como en (*X++ = V), (*X = V, ++X), o (*X = V, X++).
entrada.Un iterador X de entrada puede representar un valor unario que indica el final de la secuencia.Si un iterador de entrada no es igual al valor de la FIN-de-secuencia, puede tener un acceso indirecto V en él cualquier número de veces, como en (V = *X).Para avanzar el valor o fin siguiente de la secuencia, se aumenta, como en unaX, X++, o (V = *X++).Una vez que aumenta cualquier copia de un iterador de entrada, ninguna de las otras copias se pueden comparar, desreferenciar, o aumentar con seguridad después.
Frontal.Un iterador hacia delante X puede tomar el lugar de un iterador de salida para escribir o un iterador de entrada para leer.Puede, sin embargo, leer (con V = *X) lo que acaba de escribir (por *X = V) con un iterador hacia delante.Puede hacer varias copias de un iterador hacia delante, que se puede desreferenciar y aumentar independientemente.
bidireccional.un iterador bidireccional X puede tomar el lugar de un iterador hacia delante.Puede, sin embargo, también reducir un iterador bidireccional, como en --X, X--, o (V = *X--).
acceso aleatorio.un iterador de acceso aleatorio X puede tomar el lugar de un iterador bidireccional.También puede realizar mucho la misma aritmética de enteros en un iterador de acceso aleatorio que en un puntero de objeto.Para N, un objeto entero, puede escribir x[N], x + N, x - N, y N + X.
Observe que un puntero de objeto puede tomar el lugar de un iterador de acceso aleatorio o de cualquier otro iterador.Todos los iteradores pueden asignar o copiarse.Se supone que objetos ligeros y a menudo se pasan y devueltos por valor, no por referencia.Observe también que ninguna de las operaciones descritas previamente pueden producir una excepción cuando se realizó en un iterador válido.
La jerarquía de categorías de iterador puede ser resumida mostrando tres secuencias.Para el acceso de sólo escritura en una secuencia, puede utilizar cualquiera de:
output iterator
-> forward iterator
-> bidirectional iterator
-> random-access iterator
La flecha derecha significa “se puede reemplazar por”. Cualquier algoritmo que pide al iterador de salida debe funcionar de bienvenida con el iterador hacia delante, como, pero no el contrario.
Para el acceso de solo lectura a una secuencia, puede utilizar cualquiera de:
input iterator
-> forward iterator
-> bidirectional iterator
-> random-access iterator
Un iterador de entrada es el más débil de todas las categorías, en este caso.
Finalmente, para el acceso de lectura y escritura en una secuencia, puede utilizar cualquiera de:
forward iterator
-> bidirectional iterator
-> random-access iterator
Un puntero de objeto puede servir siempre como iterador de acceso aleatorio, por lo que puede actuar como cualquier categoría de iterador si permite el acceso de lectura y escritura adecuado a la secuencia que señala.
Un iterador Iterator distinto de un puntero de objeto también debe definir los tipos de miembro que la especialización iterator_traits<Iterator>.Observe que estos requisitos pueden cumplir Iterator derivando de la clase base pública iterador.
Esta “álgebra” de iteradores es fundamental prácticamente todo lo demás en la biblioteca de plantillas estándar.Es importante comprender las promesas y las limitaciones de cada categoría de iterador de ver cómo los iteradores utilizan los contenedores y algoritmos en STL.
[!NOTA]
También puede utilizar para cada, en para recorrer en iteración colecciones STL.Para obtener más información, vea Cómo: Recorra la colección de Compilaciones STL con para cada.
Visual C++ ahora proporciona iteradores comprobados y iteradores de depuración para asegurarse que no sobrescribir los límites del contenedor.Para obtener más información, vea Iteradores comprobados y Compatibilidad de iterador de depuración.