La Revolución y las Iteraciones en C++

Cuando las novedades se introducen por primera ves a un espacio con metodologías planteadas y definidas adereszandola con años y años de uso crea una revolución de la que todo el mundo quiere formar parte, muchas veces impacta tanto que se vuelve una tendencia. Hay muchos casos que puedo nombrar por ejemplo: Cuando La Escudería McLaren introdujo la primera carrocería hecha de fibra de carbono provoco una locura, las otras escuderías se quejaron ante la FIA y esta colmo con investigaciones para acallar las voces inpugnantes de los competidores, nadie creyó que la fibra de carbono pudiera reemplazar al aluminio que para la fecha era el componente principal en la construccion de los vehículos, peor aun pensaban que este bólido se destrozaria volviéndose polvo al tener un accidente y profesaban esa teoría con tanto fervor que dieron por muerto a John Watson cuando tuvo su primer accidente en el MP4/1 al salirse del circuito de Monaco, la ironía del hecho es que si hubiese estado detrás de un vehiculo construido usando los materiales tradicionales no se hubiese convertido en el anunciante principal de esta nueva tecnología.

En la actualidad usar fibra de carbono en los autos de formula uno se ha vuelto una tendencia inexorable y dado el roll que posee la F1 de cuna tecnológica; cada vez es mayor la presencia de estos materiales en los autos comerciales o de consumo masivo ya sea de forma ornamental o como fuente principal reemplazando el uso de metales. Otro ejemplo palpable de este tipo de revolución la encontramos en el mundo del deporte, en las olimpiadas celebradas en México en el año 1968, la categoría de Salto Alto fue provista de un evento tan particular que termino creando una tendencia posibilitando el record olímpico de Javier Sotomayor que ostenta la marca de 2.45m. Dicho evento o mas bien técnica fue denominada “the flop” o “the fusbury flop” y su creador Dick Fusbury la desarrollo al verse limitado por la que le fue impuesta por sus entrenadores (Originalmente utilizaba las técnica de las tijeras) permitiéndole ganar y romper el record de la epoca. Su técnica es actualmente utilizada por la gran mayoría de saltadores profesionales revolucionando el deporte.

Pero que tiene todo esto que ver con programación y específicamente con la manera en que iteramos en C++, desde mi punto de vista y experiencia tiene amplia relación, debido a que confiamos en el conocimiento impartido por nuestros profesores y este conocimiento moldea la manera en la que evolucionamos profesionalmente, particularmente crecí con la idea de iterar a traves de ciclos usando sentencias for y/o while dependiendo de los casos que se presentaban, estas sentencias permiten recorrer los arreglos secuencialmente, uno a uno desde el comienzo hasta el final permitiendo la elección de la información que queremos obtener o simplemente ejecutar mas sentencias. La manera en que iteramos depende intrisecamente del tipo contenedor que utilicemos y aqui es donde se desarrolla lo interesante, yo veo la iteracion STL (Standard Template Library) como la iteracion rockstar, algunos al leer esto se reiran de mi pero es porque estoy acostumbrado al modelo tradicional:

using namespace std;

vector arreglo;

arreglo.push_back(10);
arreglo.push_back(24);
arreglo.push_back(13);

for(int y=0; y<arrelgo.size(); y++)
{
cout<<arreglo[y]<<" ";
}

Y desde luego nuestro modelo rockstar:

using namespace std;

vector arreglo;
vector::iterator iterArreglo;

arreglo.push_back(10);
arreglo.push_back(24);
arreglo.push_back(13);

for(iterArreglo = arreglo.begin(); iterArreglo != arreglo.end(); iterArreglo++)
{
cout<<*iterArreglo<<" ";
}

Pero, ¿Cual es la diferencia?, simple, en el primer ejemplo usamos una iteración un un ciclo “for” comun, declaramos un vector y le incluimos 3 valores, al “for” le indicamos que va a comenzar desde 0 y aumentara ese numero siempre y cuando el valor de “y” sea menor que el tamaño del arreglo.

En el segundo ejemplo es básicamente lo mismo pero trabajamos con un iterador declarado y el ciclo “for” comenzara desde el primer valor del arreglo hasta el final, aumentando la posición del mismo. No hay mucha diferencia, algunos dicen que el segundo ejemplo es la _manera_ correcta de iterar, para mi viene siendo cuestión de costumbre debido a las experiencias pasadas (qbasic, pascal, c) lo bonito de la libertad es que podemos escoger cual de los dos utilizar. Ahora bien existen ciertas ventajas al usar iteradores siendo la mas importante la abstracción que se general al usarla y la posibilidad que nos brinda de accesar distintos contenedores sin importar el tipo de datos que guarden porque se tiende a observarlos como apuntadores limitados. Por supuesto no todo puede ser bueno y perfecto, hay que tomar en cuenta que estos no proveen un mecanismo para chequear los limites de iteración y desafortunadamente pasamos sobre el limite produciremos un Segfault. Aun quedan otras consideraciones que tomar en cuenta, pero si sigo extendiéndome mas terminaremos en una clase de “C++ For dummies” que no es lo que pretendía con el post.

Saludos, Axzel.

Anuncios

2 comentarios en “La Revolución y las Iteraciones en C++

  1. Hola, para que sepas no es sólo la abstracción, sino que considero ( no estoy 100% seguro, no he leido con detalle la implementación de los vectores )que también usar los iteradores es más eficiente. En el primer caso (sin iterador) el ciclo complento es O(n ^ 2): el primero te cuesta 1, el segundo 2, y así sucesivamente y esa sumatoria es (n(n+1))/2. En el otro caso yo creería y digo creo ya que en Java por lo menos es así y este lenguaje se base en C++, es simplemente lineal O(n), tomas el primero eso te cuesta 1 y te quedas parado ahí, luego tomas el segundo, solo te mueves un paso, por lo que te cuesta 1 mas, lo haces n veces y de ahí que es lineal. Si no sabes de teoría de complejidad, ésta lo único que hace es contar el número de pasos en función de la entrada en el peor caso, y bueno está tiene su notación asintótica matemática.

    1. Si, aparte de la abstracción lo que explicas tambien representa una excelente ventaja al contrario de la primera opcion, no lo exprese porque lo primero que se me vino a la mente en ese momento fue lo que escribi en el post, quizas sea porque tengo tiempo sin programar en C++ en favor de python y hasta donde se esta implementacion no existe (out of the box) en python, hay que utilizar algo llamado boost.python.

Los comentarios están cerrados.