domingo, 10 de noviembre de 2013

EVAP2

Librería <Functional>

Provee varios objetos funcionales, diseñados para ser utilizados porlos algoritmos estándares.

Objetos Funcionales

Un objeto de función es una programación de computadoras que permite construir un objeto que se invoque o llama como si se tratara de un ordinario función , por lo general con la misma sintaxis (un parámetro de función, que también puede ser una función).

Descripción

Un uso típico de un objeto de función es por escrito de devolución de llamada funciones. Una devolución de llamada en lenguas de procedimiento , tales como C , se puede realizar mediante el uso de punteros a funciones . Sin embargo, puede ser difícil o incómodo para pasar un estado dentro o fuera de la función de devolución de llamada. Esta restricción también inhibe el comportamiento más dinámico de la función. Un objeto de la función resuelve esos problemas ya que la función es en realidad una fachada para un objeto completo, llevando su propio estado.
Muchas lenguas modernas (y algunos más), por ejemplo, C + + , Groovy , Lisp , Perl , PHP , Python , Rubí , Scala , y muchos otros, apoyan la función de primera clase deobjetos, e incluso pueden hacer un uso significativo de ellos. La programación funcional idiomas además apoyan el cierre , es decir, las funciones de primer nivel que pueden "cerrarse sobre 'las variables de su entorno en el momento de la creación. Durante la compilación, una transformación conocida como lambda levantamiento convierte los cierres en objetos funcionales.
Ejemplo:
Consideremos el ejemplo de una rutina de clasificación que utiliza una función de devolución de llamada para definir una relación de orden entre un par de artículos. Un programa en C utilizando punteros de función puede aparecer como:

 # Include <stdlib.h>
 
/ * La función de devolución de llamada, devuelve <0 si a <b,> 0 si a> b, 0 si a == b * / 
int compareInts ( const  void * a ,  const  void * b ) 
{ 
  retorno  * ( const  int  * ) una -  * ( const  int  * ) b ; 
}
...
/ / Prototipo de qsort es 
/ / void qsort (void * base, size_t nel, ancho size_t, int (* compar) (const void *, const void *));
...
int main(void)
{
    int items[] = { 4, 3, 1, 2 };
    qsort(items, sizeof(items) / sizeof(items[0]), sizeof(items[0]), compareInts);
    return 0;
}

En C + + un objeto de función puede ser utilizada en lugar de una función ordinaria mediante la definición de una clase que sobrecarga la función de operador de llamada mediante la definición de un operador () función miembro. En C + + esto se llama un tipo de funtor clase , y puede aparecer de la siguiente manera

 / / Predicado de comparación: devuelve true si a <b, false en caso contrario 
struct IntComparator
 { 
  bool operador ( ) ( const  int  y un const  int  y b )  const 
  { 
    volverá a < b ; 
  } 
} ;
...
/ / Una sobrecarga de std :: sort es: 
template  < clase RandomIt, clase Compara > 
void ordenar ( RandomIt primero, RandomIt pasado, Compara borrador ) ;
...
int principal ( ) 
{ 
    std :: vector < int > artículos {  4 , 3 , 1 , 2  } ; 
    std :: sort ( . elementos comenzar ( ) ., artículos finales ( ) , IntComparator ( ) ) ; 
    vuelta  0 ; 
}

Observe que la sintaxis para proporcionar la devolución de llamada para los sortInts () función es idéntica, sino un objeto se pasa en lugar de un puntero a función. Cuando se invoca la función de devolución de llamada se ejecuta como cualquier otro miembro de la función, por lo que tiene acceso completo a los demás miembros (datos o funciones) del objeto.


Es posible utilizar objetos de función en situaciones distintas a las funciones de devolución de llamada (aunque el reducido plazo funtor normalmente no se utiliza). Continuando con el ejemplo,

 IntComparator cpm
  bool resultado = cpm ( a, b ) ;

Además de funtores tipo de clase, otros tipos de objetos de función también son posibles en C + +. Ellos pueden tomar ventaja de C + + de este miembro y agujas, o plantilla delas instalaciones. La expresividad de plantillas permite que algunos de programación funcional técnicas que se utilizarán, como la definición de los objetos de función en términos de otros objetos de función (como la composición de la función ). Gran parte de la C + + Biblioteca de plantillas estándar (STL) hace un uso intensivo de los objetos funcionales basados en plantillas.



C + 11 permite definir la función anónimos objetos. La línea del ejemplo anterior se podría escribir de la siguiente manera:

sortInts ( . artículos comienzan ( ) ., artículos finales ( ) , [ ] ( int a, int b )  {  retorno a < b ;  } ) ;

No hay comentarios:

Publicar un comentario