Iteradores de inserción (Programación)

Revisión del 15:56 18 nov 2012 de Majibacoa2 jc (discusión | contribuciones) (Página creada con '<div align="justify">{{Definición|Nombre= Iteradores de inserción (Programación)|imagen= |concepto= Es un tipo especial de Iterador de salida (Output iterator) que permite re...')
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Iteradores de inserción (Programación)
Información sobre la plantilla
Concepto:Es un tipo especial de Iterador de salida (Output iterator) que permite realizar inserciones sobre un contenedor

Iteradores de inserción (Programació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.

Justificación

Normalmente la asignación a la deferencia de un iterador (expresiones del tipo *SomeIterator = Value;) se utilizan para sobrescribir el valor del miembro señalado por el iterador. Por ejemplo, la siguiente invocación al algoritmo copy copia los miembros de un contenedor en otro, aunque el contenedor de destino debe estar definido y correctamente construido con el tamaño adecuado

vector<int> v1(10);
vector<int> v2(10);
list<int> L1;
...
copy (v1.begin(), v1.end(), v2.begin());
copy (v1.begin(), v1.end(), L1.begin());    §1a

La última sentencia muestra como incluso pueden sobrescribirse mediante este algoritmo contenedores de distinta clase (asumiendo que sus miembros sean del mismo tipo). En este ejemplo, el contenedor L1 tiene al menos, diez elementos, que son sustituidos por los miembros de v1. Algunos contenedores de la STL, como los tipos list y set, tienen la capacidad de crecer de forma dinámica a medida que se incluyen nuevos miembros. En estos casos puede ser más apropiado insertar de nuevos elementos antes que sobrescribir los antiguos. La STL ofrece iteradores específicos que permiten que algoritmos como el anterior, inserten un nuevo elemento en la posición señalada antes que sobrescribir el existente (evidentemente esta operación supone un aumento de tamaño del contenedor). Por ejemplo, sustituyendo el tercer argumento de la última sentencia del ejemplo por un iterador de inserción:

copy (v1.begin(), v1.end(), front_inserter(L1));   §1b

Se evita la necesidad de que el contenedor L1 tenga que tener inicialmente diez elementos. Podría estar inicialmente vacío, y el algoritmo copy lo llenaría con el contenido del vector v1.

Descripción

El algoritmo copy acepta tres iteradores; los dos primeros delimitan el rango de entrada, y el tercero el principio del rango de salida. Es interesante observar que en la sentencia anterior, los rangos de entrada está definidos mediante los valores devueltos por las funciones begin() y end(), que son métodos de la clase vector. En cambio, el tercer argumento es el valor devuelto por una función genérica front_inserter() que responde a la siguiente declaración:

template <class Container>
  front_insert_iterator<Container> front_inserter(Container& x)

La función recibe un contenedor x (por referencia), y devuelve una instancia de la clase front_insert_iterator para el objeto x en cuestión. Este objeto es un iterador que permite al algoritmo copy insertar elementos al principio del contenedor x.

Tipos de iterador de inserción

Existen tres formas de iterador de inserción según la posición del contenedor de salida en que esta se realice: al principio; al final; o en una posición cualquiera definida por el usuario.

Inserción al principio

Los iteradores de inserción al principio de un contenedor, son instancias de la clase front_insert_iterator. La forma de obtenerlos para un contenedor determinado c, es mediante una invocación a la función genérica front_inserter(c).

Inserción al final

Los iteradores que permiten insertar elementos al final de un contenedor son instancias de la clase back_insert_iterator. La forma de obtenerlos para un contenedor c determinado es también mediante el valor devuelto por una función genérica: back_inserter(c). El prototipo de esta función es el siguiente:

template <class Container>
  back_insert_iterator<Container> back_inserter (Container& x)

Este tipo de iterador puede usarse para insertar elementos al final de estructuras deque, list y vector, pero no con map o set.

Inserción intermedia

Existe un tercer tipo de iteradores, objetos derivados de la clase insert_iterator, que permiten insertar elementos en cualquier posición de un contenedor. La interfaz de esta clase genérica, definida como todas las demás en el subespacio std, es la siguiente:

template <class Container>
 class insert_iterator :
 public iterator<output_iterator_tag,void,void,void,void> {
 protected:
   Container* container;
   typename Container::iterator iter;
 public:
   typedef Container container_type;
   insert_iterator(Container& x, typename Container::iterator i);
   insert_iterator<Container>&
      operator=(typename Container::const_reference value);
   insert_iterator<Container>& operator*();
   insert_iterator<Container>& operator++();
   insert_iterator<Container>& operator++(int);
};

Para crear un iterador que permita insertar elementos en la posición pos de un contenedor c concreto, puede utilizarse el constructor de la clase, aunque es preferible utilizar el valor devuelto por la función inserter(). Esta función genérica responde a la siguiente declaración:

template <class Container, class Iterator>
  insert_iterator<Container> inserter(Container& c, Iterator pos);

Devuelve un iterador del tipo insert_iterator construido "ex profeso" para insertar elementos en la posición inmediatamente anterior a la señalada por el argumento pos del contenedor c. Este tipo de iterador puede ser utilizado con los contenedores deque, list y vector.

Puede Consultar

Fuente