Ivan Colmenares Un iterador es un puntero que es utilizado por un algoritmo para recorrer los elementos almacenados en un contenedor. Dado que los distintos algoritmos necesitan recorrer los contenedores de diversas maneras para realizar diversas operaciones, y los contenedores deben ser accedidos de formas distintas, existen diferentes tipos de iteradores. Cada contenedor de la Librería Estándar puede generar un iterador con funcionalidad adecuada a la técnica de almacenamiento que utiliza. Es precisamente el tipo de iterador requerido como argumento, lo que distingue qué algoritmos STL pueden ser utilizados con cada clase de contenedor. Por ejemplo, si un contenedor solo dispone de iteradores de acceso secuencial, no pueden utilizarse con algoritmos que exijan iteradores de acceso aleatorio. La clase iterator La sentencia anterior, donde se declara un iterador iT1 de la clase vector<int> es fundamental para entender la naturaleza de los iteradotes std::vector<int>::iterator iT1; Esta sentencia instancia un objeto iT1 de la clase iterator que pertenece al espacio de una instanciación concreta, vector<int>, de una clase genérica vector<T>. La clase iterator para vectores-de-int está definida en el ámbito de la clase genérica vector<T>. Es decir, la definición del contenedor vector es algo como: template <class T, ...> vector { public: class iterator; }; A su vez esta clase iterator debe dispone de su propia definición en algún punto de la cabecera <vector>: class vector<T>::iterator { /* definición dependiente de la implementación */ }; Características Existen diversas características principales que distinguen unos iteradores de otros. Podemos resumirlas como sigue: Capacidad de modificar los datos subyacentes. En este sentido pueden ser de solo lectura; solo escritura, o lectura/escritura. Tipo de desplazamiento que puede realizarse con ellos para recorrer el contenedor. Puede ser de avance secuencial; avance y retroceso secuencial, o acceso aleatorio. Otras características adicionales. Por ejemplo, la posibilidad de ser utilizados por algoritmos que permiten insertar o borrar elementos del contenedor asociado. Categorías El estándar distingue cinco variedades de iteradores (denominadas categorías) en función de algunas de las características antes enunciadas: Corresponden al esquema de la figura adjunta y responden las definiciones siguientes: struct InputIterator { ... }; struct OutputIterator { ... }; struct FordwarIterator : public InpuptIterator { ... }; struct BidirectionalIterator : public FordwardIterator { ... }; struct RandomAccessIterator : public BidirectionalIterator { ... };