Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


5.1.2b Iteradores de salida

§1 Sinopsis

Los iteradores de salida (OutputIterator) sirven a operaciones de escritura de datos. El destino de los datos puede ser un contenedor STL; un flujo ("stream"); un contenedor definido por el usuario, etc. Son de escritura y movimiento hacia delante. Esto significa que solo pueden usarse para asignar valores a los miembros de la secuencia, y que solo está permitido con ellos el operador de desplazamiento hacia adelante ++.

§2 Descripción

Un uso típico de estos iteradores es para escribir datos en un contenedor que han sido leídos de otro. Por ejemplo, el siguiente código es un algoritmo genérico que copia el contenido de una secuencia en otra [1]:

template <class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first,
                     InputIterator last,
                     OutputIterator result) {
    while (first != last) *result++ = *first++;
    return result;
}

Comentario:

Algunos algoritmos de la STL manejan simultáneamente dos secuencias. Con frecuencia la segunda secuencia es definida solo a través de un iterador (en lugar de utilizar dos para describir un rango 5.1.2), de forma que solo se necesitan tres iteradores para designarlas; un rango para la primera y un valor inicial para la segunda. Las operaciones suponen leer ciertos datos de la primera secuencia, que denominaremos "de entrada", y escribirlos en la segunda, denominada "de salida". Para esto se supone que existen suficientes miembros a partir de este último iterador para contener los elementos definidos en la primera secuencia. Este último extremo no es comprobado por el compilador, de forma que queda a responsabilidad del programador su verificación.

La función copy(), cuyo prototipo se ha mostrado en el ejemplo, es un caso típico de lo anterior. El rango de entrada está definido por los iteradores de entrada first y last;  el rango de salida está determinado por el iterador de salida result.

Observe que si ambos rangos se refieren al mismo contenedor, la función puede realizar transformaciones internas. Si por el contrario se refieren a contenedores distintos, los datos leídos del contenedor de entrada son copiados al de salida. Observe también que la característica principal del iterador de salida result, es que solo puede ser utilizado para modificar los valores a los que señala utilizando su deferencia como un Lvalue; no está permitido con ellos ningún otro uso. Por ejemplo, obtener los valores a los que señalan.

§3 Tipos de iteradores de salida

Lo mismo que con los de entrada, pueden distinguirse varias clases de iteradores de salida que detallamos a continuación:

§3.1 Punteros ordinarios

Como señalábamos en la página anterior ( 5.1.2a), los punteros ordinarios gozan de las propiedades de los iteradores de acceso aleatorio, que son un superconjunto de los punteros de salida. Por ejemplo, el contenido de dos matrices ordinarias puede ser refundido en una sola utilizando un algoritmo estándar:

int datai1[50];
int datai2[50];
int datafin[100];
...
copy (datai1, datai1+50, datafin);
copy (datai2, datai2+50, datafin+50);

§3.2 Iteradores de salida de contenedor estándar

También es digno de mención que todos los iteradores definidos en los contenedores de la STL pueden ser utilizados como iteradores de salida. Ambas premisas permiten escribir un código como el que sigue, en el que una matriz ordinaria es copiada a un contenedor tipo vector ( 5.1.1) mediante un algoritmo genérico:

int data[100];
vector<int> vdata(100);
...
copy (data, data+100, vdata.begin());

§3.3 Iteradores de inserción

Este tipo de iterador (insert_iterator) se diferencia de los iteradores de salida estándar en que en vez de sustituciones, realiza inserciones en el contenedor de salida. Esto permite efectuar operaciones del tipo realizado por el algoritmo copy en contenedores de longitud variable, tales como listas y sets, al tiempo que permite al programador desentenderse de comprobar que el contenedor de salida es suficiente para albergar el rango de entrada.

§3.4 Iteradores de flujo de salida

La STL también proporciona iteradores que pueden ser utilizados con flujos de salida. Son los denominados ostream_iterator, que permiten utilizar los algoritmos de la STL que admiten iteradores de salida con los contenedores de flujo de salida basic_ostream.

  Inicio.


[1]  Es la definición del algoritmo copy() de la STL ( 5.1.3).