trabajo de estructura de datos

16
Estructura de Datos Templates Víctor Márquez

Upload: victor-marquez-hakuna-matata

Post on 03-Aug-2015

273 views

Category:

Education


0 download

TRANSCRIPT

Estructura de DatosTemplates

Víctor Márquez

Templates• Las plantillas o templates nos proporcionan de

manera rápida y eficaz, configuraciones prestablecidas de diferentes códigos de programación, agilizando y optimizando de esta manera nuestro proyecto C++.

• Las plantillas son uno de los grandes aportes de C++ al lenguaje C.

Templates

• Hasta antes de las plantillas, se pasaban variables como parámetros de las funciones. Gracias al concepto de plantilla, es posible pasar valores como parámetros, y de este modo definir funciones genéricas. Pero el concepto de plantillas no se limita a las funciones, también puede ser utilizado en clases y estructuras.

Ventajas

• Generalización: desde el momento en que el valor incluye todo lo que es utilizado en la función o clase-plantilla, es posible pasar cualquier valor como parámetro.

• Simplicidad: únicamente se codifica una función o clase sin importar el valor pasado como parámetro, lo que hace que el mantenimiento del código sea más fácil.

¿Como utilizar los templates?

• El uso de plantillas es apropiado para definir contenedores, es decir estructuras que sirven para almacenar una colección de objetos (una lista, un vector, un grafo)

• Las plantillas también son apropiadas para definir algoritmos genéricos que se aplican a una familia de clase. Por ejemplo, es interesante codificar un algoritmo del camino mas corto, independientemente de la estructura del grafo.

• El uso de un functor puede ser apropiado para acceder a los pesos instalados sobre los arcos del grafo en este caso. La clase de grafo pasada como parámetro debe cumplir un cierto número de pre-requisitos para que el algoritmo pueda ser aplicado. Si no, el programa no compilará.

¿Como utilizar los templates?

Convencion de notaciones

• Los parámetros de plantillas son generalmente escritos en mayúsculas (mientras que los otros tipos son generalmente escritos en minúscula). En la práctica, podemos escribirlos como queramos. Personalmente los escribo precedidos de una T (por ejemplo Tgraph para designar un parámetro de plantilla que representa un grafo). Esto puede parecer inútil pero veremos que es muy práctico con los typenames ya que vuelve el código más legible.

Templates comunesSTL• La STL (Standard Template Library) viene por

defecto con los compiladores C++. Esta biblioteca incluye un juego de contenedores genéricos, especialmente: std::vector: vectores (tabla de elementos de tipo T adyacentes en memoria), acceso en O(1), std::set: conjuntos de elementos de tipo T sin repeticiones y ordenados según el operador <, acceso en O(log(n)), std::list: listas encadenadas (acceso en O(n), inserción al inicio y al final de la lista en O(1)).

Templates comunesBGL

• La BGL (Boost Graph Library) proporciona clases de grafo genéricos y los algoritmos correspondientes (algoritmo del camino más corto, algoritmo de float, ect).

Templates de función

• Hemos visto anteriormente, que las funciones genéricas son un mecanismo C++ que permite definir una función mediante uno o varios parámetros (tipos genéricos). A partir de estas plantillas el compilador es capaz de generar código de funciones distintas que comparten ciertas características.

Templates de clase generica

• Son un artificio C++ que permite definir una clase mediante uno o varios parámetros. Este mecanismo es capaz de generar infinitas clases distintas pero compartiendo un diseño común. Al igual que en plantillas de funciones, las clases así generadas se denominan instancias o especializaciones de la plantilla.

Trabajar con templates

Para trabajar con plantillas, necesitamos 3 cosas:

• La palabra clave typename: indica que el tipo que sigue es abstracto (parámetro de plantilla o depende de un parámetro de plantilla) y debe ser tomado en cuenta únicamente cuando se le instancia.

Trabajar con templates

• La palabra clave template: indica que la clase o función que le sigue toma parámetros de plantilla. Después de la palabra clave template se escriben directamente los parámetros de plantilla (precedidos de la palabra clave typename, struct, class, o tipo de base según el tipo de parámetro de plantilla esperado) entre “<< >>”, seguidos de la clase o función.

Trabajar con templates

• El operador: permite acceder a los campos (en particular los tipos) y métodos estáticos de una clase o de una estructura. No es especifico a las plantillas (se aplica a las clases y estructuras en general y a los namespaces).

Recomendaciones• Es aconsejable realizar el diseño y una

primera depuración con una clase normal antes de convertirla en una clase genérica.

• Es más fácil imaginarse el funcionamiento referido a un tipo concreto que a entes abstractos.

• Es más fácil entender los problemas que pueden presentarse si se maneja una clase concreta.

• En estos casos es más sencillo ir de lo particular a lo general.

Fin