5.1.2d Iteradores bidireccionales
§1 Sinopsis
Los iteradores bidireccionales (BidirectionalIterator) son similares a los iteradores adelante en que combinan las características de los iteradores de entrada y de salida, y en que pueden ser utilizados para lectura y escritura de datos en el contenedor asociado. Pero permiten movimientos en ambas direcciones, de forma que pueden utilizarse con ellos los operadores ++ y --.
§2 Descripción
Un ejemplo de utilización de estos iteradores lo encontramos en el algoritmo reverse_copy(). Este algoritmo es
similar a la función copy() comentada anteriormente (
5.1.2b), pero utiliza la capacidad de desplazamiento descendente de la secuencia de salida
para copiar los elementos de un contenedor a otro invirtiendo su orden original. El su prototipo es el siguiente:
template <class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy (
BidirectionalIterator first,
BidirectionalIterator last,
OutputIterator result) {
while (first != last) *result++ = *--last;
return result;
}
La secuencia de entrada está representada por el rango [first, last), y como ocurre en este tipo de
operaciones, el elemento señalado por last no es incluido en el proceso de copia. Los miembros señalados por
el rango de entrada son copiados en el contenedor de salida a partir de la posición señalada por result.
A continuación se muestra el código utilizado para copiar en orden inverso el contenido de una lista enlazada cList en un contenedor cVec tipo vector:
list<int> cList;
...
vector<int> cVec (cList.size()); // L.3:
reverse_copy (cList.begin(), cList.end(), cVec.begin() );
Observe que la sentencia L3 crea el contenedor cVec con tamaño suficiente para albergar el contenido de la lista cList.