Boost es un conjunto de librerias de software libre y revisión por pares preparadas para extender las capacidades del lenguaje de programación C++. Su licencia, de tipo BSD, permite que sea utilizada en cualquier tipo de proyectos, ya sean comerciales o no.

Su diseño e implementación permiten que sea utilizada en un amplio espectro de aplicaciones y plataformas. Abarca desde bibliotecas de propósito general hasta abstracciones del sistema operativo. Con el objetivo de alcanzar el mayor rendimiento y flexibilidad se hace un uso intensivo de plantillas. Boost ha representado una fuente de trabajo e investigación en programación genérica y metaprogramación en C++.

Varios fundadores de Boost pertenecen al Comité ISO de Estándares C++. La próxima versión estándar de C++ incorporará varias de estas bibliotecas.

Vamos a hablar un poco de vectores e iteradores en C++. Como derivado de C es comun que muchos desarrolladores a pesar de conocerlos les cueste adaptarse al uso de iteradores.

Contenedores, los vectores:

Un contenedor de la STL es una clase genérica que puede instanciarse para representar diversos tipos de objetos. Esta clase incluye ciertas operaciones (muy básicas) sobre los objetos de su tipo;  estas operaciones están representadas por funciones-miembro, incluyendo constructores y funciones-operador, que son a su vez funciones genéricas.

De su propio nombre (“Containers”) podemos deducir que su misión principal es funcionar como estructuras de datos, y en este sentido podemos decir que entre sus funcionalidades más destacadas se encuentran la gestión del espacio de almacenamiento necesario lo que de por si es una gran ventaja ya que el programador no tiene que preocuparse de asignar o liberar memoria para los objetos creados.

Veamos uso de los contenedores mediante un sencillo ejemplo, si tenemos que manejar un conjunto de enteros, puede utilizarse una matriz de enteros, pero ya hemos señalado que esta estructura nos obliga a conocer de antemano la cantidad de datos a almacenar (el tamaño de la matriz).

Una alternativa es utilizar como “contenedor” para nuestros enteros una clase genérica de la STL denominada vector.

Como se puede observa en la linea 8 definimos un vector de tipo int al que llamamos enteros.

Teniendo ya el objeto disponible vamos a usar uno de sus métodos o funciones miembro “push_back” para ir cargando el vector con valores del tipo que fue definido.

Luego mediante cout podemos acceder a los valores almacenados en el vector de la misma manera que lo haríamos en un array, es decir a travez de su indice.

¿Sencillo no? Y lo mejor de todo es que nos despreocupamos completamente de la dimensión de la colección y el manejo de memoria.

Iteradores:

Pero vamos un poco mas alla con C++, veamos como podemos usar un iterador para recorrer nuestro vector.

El concepto de iterador es fundamental para entender las clases de contenedores y algoritmos asociados inclusos en la Librería Estándar de Plantillas de C++.   En realidad los algoritmos son funciones globales que aceptan iteradores como argumentos, y a través de ellos puedan operar sobre los elementos del contenedor.

Un iterador es una especie de 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.

Pero vamos a un ejemplo que es la mejor forma de entenderlos:

Acá incorporamos un iterador, en la linea 9 declaramos un iterador a un vector de enteros.

Mas abajo podemos observar que en la linea 13 apuntamos con el iterador al primer elemento-ítem de nuestro vector.

Luego en la linea 14, 15 y 16 podemos ver como accedemos los enteros almacenados en el vector mediante los iteradores, observe que para acceder al valor se usa “*” como lo hacemos con punteros.

Pongamos atención ahora a la construcción de las lineas 17-19, este es el uso común y adecuado que se hace de los iteradores para recorrer una colección, en este caso mediante “for” que es en esencia un iterador.

Observemos que es este ultimo ejemplo hemos utilizado los métodos .begin() u .end() para denotar los limites de acción de for. También debemos notar que usamos el operador de  auto-incremento ++ para el iterador.

Bueno queridos lecoter espero que les haya gustado.

Resulta que Pi también desempeña un papel importante en un experimento llamado “el problema de la aguja de Buffon“, el cual buscar determinar la probabilidad de que objetos alargados  uniformes,  arrojados aleatoriamente aterricen en medio o atravesando una serie de líneas paralelas en el suelo.
Resulta que si la distancia entre las líneas es la misma que la longitud de los objetos lanzados, el número de veces que los objetos aterrizan atravesando las líneas (luego de un gran número de lanzamientos) se puede utilizar para calcular el valor de Pi. aguja de buffon
Se trata de lanzar una aguja sobre un papel en el que se han trazado rectas paralelas distanciadas entre sí de manera uniforme. Se puede demostrar que si la distancia entre las rectas es igual a la longitud de la aguja, la probabilidad de que cruce alguna de las líneas es  2/\pi.
Los científicos y los matemáticos aún no han descubierto la forma para calcular el valor exacto de Pi, ya que no se ha podido encontrar un material lo suficientemente delgado con el cual se obtengan cálculos exactos.
Articulo anterior: Funciones lambda en C++ (I)
Sintaxis
La utilidad fundamental de la expresión lambda es la generación directa del objeto función en el lugar mismo de su uso, sin necesidad de definir su clase en otra sección apartada del código.
La sintaxis de una funcion Lambda lleva la siguiente forma:
[captura] (parametros) mutable noexcept -> tipo de retorno { expresión }
Sección Nombre Propiedades
[]
Introductor o cláusula de captura.
Con o sin lista de captura interior (ver más adelante).
()
Declarador o lista de parámetros.
Puede omitirse en ausencia de parámetros siempre que no se utilicen los declaradores mutable y noexcept.
mutable
Las variables capturadas en el introductor puedan ser modificadas en el cuerpo de la función. (opcional)
noexcept
Indica que la función no emite excepciones. (Opcional)
-> tipo de retorno
Tipo de retorno.
De ser omitido, el tipo es inferido a partir de las cláusulas de retorno de la función (o bien se toma como void en ausencia de las mismas).
{}
Cuerpo de la función lambda.
Aca va la expresión que es la que se evalua y ejecuta
Una expresión lambda puede  capturar variables en su ámbito mediante su introductor o cláusula de captura. Existe los siguientes tipos de capturas:
Modo Propiedades
[]
Modo por defecto. Ninguna variable externa es capturada.
[=]

Todas las variables externas utilizadas por la expresión lambda son capturadas por valor.
[&]
Todas las variables externas utilizadas por la expresión lambda son capturadas por referencia.
[capture_list]
Sólo la lista de nombres capture_list es capturada (por referencia va precedido de &).
[=,capture_list]
Todas las variables no incluidas en capture_list son capturadas por valor.
[&,capture_list]
Todas las variables no incluidas en capture_list son capturadas por referencia.

Todo lo comentado sobre las funciones Lambda hace referencia a tal y como fueron introducidas en el lenguaje al aprobarse el estándar C++11.

Y pese a la potencia de las funciones Lambda, el no poder hacer una plantillas Lambda también supone un inconveniente en algunos contextos. Por lo que el estándar C++14 amplía las funciones Lambda.

Hoy vamos a comenzar a tratar el tema de programación funcional en C++, lo primero que haremos es dar una muy breve definición de “Programación Funcional”.

Recordemos que un programa transforma datos de entrada en un resultado. Un programa en un lenguaje de programación funcional es una colección de funciones que son quienes procesan los datos de entrada para producir la salida, Los lenguajes de programaci ́on funcional contienen expresiones para definir funciones.

Una de las caracteristicas basicas de la programacion funcional son las funciones lambda, Las funciones lambda son en realidad expresiones, son definiciones mínimas y anónimas son una función que toma cualquier número de argumentos  y devuelve el valor de una expresión simple. Las funciones lambda no pueden contener órdenes, y no pueden contener tampoco más de una expresión.

Veamos un muy breve ejemplo:

Bueno esta es una muy breve introducción a funciones lambda de la programación funcional de C++, en el próximo capitulo veremos construcciones mas complejas y el uso de todas sus características.

Hace un par de semanas fui invitado a las VI Jornadas de Software Libre que organiza la Universidad Nacional de Jujuy. En esta ocasión presente una disertación sobre “Programación funcional en Python”.

La idea de la presentación era que este diseñada para presente un tema sin mayor detalle, entrar directamente a comprender su funcionalidad y modo de uso con ejemplos concretos.

Como siempre, he adornado las diapositivas con un tema complementario, en este caso imágenes y frases tomadas del excelente libro “Alicia en el país de las maravillas.

Espero que les sirva y lo disruten.lo pueden descargar del siguiente enlace programacionfuncional.

Esta tarde a las 17 horas en el aula Petroleo 22, de la facultad de Ingeniería de la Universidad Nacional de Jujuy voy a dar un taller del nuevo protocolo de Internet IPv6. Cubre la presentación de las características técnicas del mismo, una introducción a su arquitectura, un plan de transición y un caso de estudio para la implementación. Espero que les guste. Dejo aca las diapositivas del Taller IPv6