Introducción a la programación genérica
STL, una obra representativa de la programación genérica, es un componente de software eficiente, genérico e interoperable. STL es una biblioteca de algoritmos genéricos (Algoritmos genéricos) basada en iteradores y contenedores. La existencia de contenedores permite que estos algoritmos tengan algo sobre lo que operar. STL contiene varios algoritmos genéricos (algoritmos), iteradores genéricos (iteradores), contenedores genéricos (contenedores) y objetos de función (objetos de función). STL no es sólo una colección de componentes útiles, es una arquitectura formal y organizada que describe las condiciones abstractas de los requisitos de los componentes de software.
El primer beneficio de los genéricos es la estricta verificación de tipos en el momento de la compilación. Esta es la característica más importante del marco de recopilación. Además, los genéricos eliminan la mayoría de las conversiones de tipos. Sin genéricos, tendría que realizar conversiones de tipos cuando utilice el marco de colecciones.
La comprensión de los genéricos se puede resumir en la siguiente oración. Pasa el tipo de datos como parámetro.
La motivación cuando se propuso por primera vez la programación genérica fue simple y directa: inventar un mecanismo de lenguaje que pudiera ayudar a implementar una biblioteca contenedora estándar universal. La llamada biblioteca de contenedores estándar universal debe poder hacer cosas como usar una clase Lista para almacenar todos los tipos posibles de objetos. Las personas que estén familiarizadas con otros lenguajes orientados a objetos deberían saber que en Java. esto se hace a través de Lista. Esto se logra almacenando referencias de Objetos. La herencia de raíz única de Java juega un papel clave aquí. Sin embargo, la herencia de raíz única es insoportable para lenguajes como C que se encuentran en la parte inferior de la cadena de lenguajes. Además, el uso de la herencia de raíz única para implementar un contenedor universal también traerá problemas de eficiencia y seguridad de tipos, los cuales son inconsistentes con el concepto de C. La programación genérica nació originalmente en C y fue fundada por Alexander Stepanov[2] y David Musser[3]. El propósito es implementar STL (Biblioteca de plantillas estándar) de C. Su mecanismo de soporte de idiomas son las plantillas. El espíritu de las plantillas es realmente muy simple: tipos parametrizados. En otras palabras, la información de tipo en un algoritmo o clase que originalmente es específica de un determinado tipo se extrae y se convierte en un parámetro de plantilla T. Por ejemplo, después de generalizar qsort, se convierte en:
templatelt; class RandomAccessIterator, class Comparegt;
void sort(RandomAccessIterator primero, RandomAccessIterator último,
Compare comp );
El par de iteradores primero y último representan un intervalo cerrado y luego abierto. Los iteradores y los intervalos cerrados y luego abiertos son los conceptos centrales de STL. Los iteradores modelan la interfaz de los punteros integrados (desreferencia, incremento, decremento, etc.) El intervalo de cierre frontal y apertura posterior es un concepto matemático simple, que representa el intervalo desde el primero (incluido el primero) hasta el último (excluyendo el último). ). de todos los elementos. Además, comp es un funtor. Los functores también son el concepto central de STL. Los functores son interfaces para modelar funciones integradas. Un functor puede ser una función integrada o un objeto de clase que sobrecarga el operador (), siempre que admita llamadas a funciones. convertirse en un funtor.
A través de la sobrecarga de operadores, C permite que los tipos personalizados tengan la misma interfaz de uso que los tipos integrados y, a través de mecanismos de tipos parametrizados, como plantillas, C permite que un algoritmo o una definición de clase utilice dicha coherencia de interfaz para generalizar; sí mismo. Por ejemplo, un algoritmo que originalmente operaba con punteros integrados se generalizó a un algoritmo que opera con todos los iteradores.
Un algoritmo que originalmente usaba punteros de función integrados se generalizó para aceptar todos los objetos de clase que sobrecargan el operador de llamada de función (operador()).