1 / 43

Informática II

Informática II. Clase 13: Plantillas. Diego Fernando Serna Restrepo. Semestre 2011/2. Chiste del Día. Contenido. Plantillas. 1. Clases Plantillas. 2. Plantillas de funciones. 3. 4. Librería estándar de plantillas (STL). Plantillas.

brad
Download Presentation

Informática II

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Informática II Clase 13: Plantillas Diego Fernando Serna Restrepo Semestre 2011/2

  2. Chiste del Día Informática II 2011/2

  3. Contenido Plantillas 1 ClasesPlantillas 2 Plantillas de funciones 3 4 Librería estándar de plantillas (STL) Informática II 2011/2

  4. Plantillas • Cuando se crea una función o una clase, se debe especificar el tipo de dato que recibe como parámetros y los que retorna, esto para el caso de las funciones, y los tipos de datos que contiene la clase como variables miembros y los tipos de datos con que operan sus métodos. Informática II 2011/2

  5. Plantillas • Cuando se desea ingresar un tipo de dato con el cual no fue definida la función o clase, se debe sobrescribir para poder operar sobre esta, esto implica una definición diferente por cada tipo de dato. Esto se hace difícil de mantener en la práctica, pues si se desea hacer un corrección, o incluir algún aditamento se debe hacer sobre la totalidad de las definiciones, además que el código sería muy largo y difícil de mantener. Informática II 2011/2

  6. Plantillas • Las plantillas (templates)resuelven este problema, estas nos permiten parametrizar estas clases o funciones para adaptarlas a cualquier tipo de dato. Informática II 2011/2

  7. Tipos parametrizables • Las plantillas nos permiten decirle al compilador que haga el trabajo pesado por nosotros, y que sea el quien genere una declaración de una función o clase para que estas puedan operar o tratar con un tipo de dato en concreto, sin nosotros entrar a implementar una declaración por cada tipo existente. Informática II 2011/2

  8. Cómo crear una plantilla? Informática II 2011/2

  9. Funciones Plantilla • La sintaxis para declarar una funciónplantilla es parecida a la de cualquier otra función, pero se añade al principio una declaración del tipo de dato que se usará como referencia en la plantilla: tipo de dato que utilizará la función (class, struct, int, float, bool…) • template<datatype1 parametro1, datatype2 parametro2..> • parametro1 funcion1(parametro2) • { • // Declaración de función • }; identificador o nombre alternos dados a los tipos datos Informática II 2011/2

  10. Funciones Plantilla • template<class T> • T max(T x, T y) { • return (x > y) ? x : y; • }; Asignación condicional: expresión booleana ? valor si cierto : valor si falso. • int a=2; • char b='j'; • int c=max(a,b); Podemos usar argumentos de cualquier tipo, no han de ser siempre necesariamente clases. Pero cosas como estas darán error de compilación El motivo es que a y b no son del mismo tipo.Sin embargo, están permitidas todas las combinaciones en las que los argumentos sean del mismo tipo o clase, siempre y cuando que el operador > esté implementado para esa clase. • int a=3, b=5, c; • char f='a', g='k', h; • c = max(a,b); • h = max(f,g); Informática II 2011/2

  11. Contenido Plantillas 1 ClasesPlantillas 2 Plantillas de funciones 3 4 Librería estándar de plantillas (STL) Informática II 2011/2

  12. Clases Plantilla • La sintaxis para declarar una clase plantilla es parecida a la de cualquier otra clase, pero nuevamente se debe añadir al principio una presentación de la clase que se usará como referencia en la plantilla: • template<class id> • classnombreClase • { • // Declaración de funciones • // y datos miembro de la plantilla • }; Informática II 2011/2

  13. Clases Plantilla • template<class T> • class Tabla { • public: • Tabla(intnElem); • ~Tabla(); • T& operator[](intindice) { returnpT[indice]; } • private: • T *pT; • intnElementos; • }; La clase Tabla nos permite crear arrays de la dimensión que queramos, para almacenar cualquier tipo de dato. Informática II 2011/2

  14. Métodos de una clase Plantilla Dentro de la declaración y definición de la clase, podremos usar los parámetros que hemos especificado en la lista de parámetros del template como si se tratase de “comodines.” • Cuando tengamos que definir una función miembro fuera de la declaración de la clase, tendremos que incluir la parte del template, y como nombre de la clase incluir la plantilla antes del operador de ámbito (::). • // Definición: • template<class T> • Tabla<T>::Tabla(intnElem) : nElementos(nElem) { • pT = new T[nElementos]; • } • template<class T> • Tabla<T>::~Tabla() { • delete[] pT; • } Informática II 2011/2

  15. Objetos utilizando la Plantilla • La sintaxis es la siguiente Nombre Clase <tipo/clase> Nombre Objeto (Parámetros del constructor) plantilla • Tabla<int> TablaInt(32); // Tabla de 32 enteros • Tabla<float> TablaFloat(12); // Tabla de 12 floats • Tabla<bool> TablaBool(10); // Tabla de 10 bools El compilador sustituirá los comodines (T) por los tipos que especifiquemos. Informática II 2011/2

  16. Objetos utilizando la Plantilla • template <class T, intnElementos> • class Tabla { • public: • Tabla(); • ~Tabla(); • T& operator[](intindice) { returnpT[indice]; } • private: • T *pT; • }; • // Definición: • template <class T, intnElementos> • Tabla<T,nElementos>::Tabla() { • pT = new T[nElementos]; • } • template <class T, intnElementos> • Tabla<T, nElementos>::~Tabla() { • delete[] pT; • } • Las plantillas admiten varios parámetros, de modo que también podríamos haber especificado el número de elementos como un segundo parámetro de la plantilla: Esta forma tiene una limitación: el argumento nElementos debe ser una constante, nunca una variable. Esto es porque el valor debe conocerse durante la compilación del programa. • Tabla<int,32> TablaInt; // Tabla de 32 enteros • Tabla<float,12> TablaFloat; // Tabla de 12 floats • Tabla<bool,10> TablaBool; // Tabla de 10 bools Informática II 2011/2

  17. Contenido Plantillas 1 ClasesPlantillas 2 Plantillas de funciones 3 4 Librería estándar de plantillas (STL) Informática II 2011/2

  18. Plantillas de funciones • También será posible declarar funciones que utilicen instancias de las clases de plantillas, para este caso no será necesario utilizar la línea de declaración de plantilla; Sin embargo, si se deberá pasar su instancia específica. • voidunaF(Array<int> &); • voidunaF(Array &); • template <class T> voidunaF(Array<T> &); Informática II 2009/2

  19. Plantillas y funciones amigas Las clases plantillas pueden declarar diferentes tipos de funciones amigas: • Clases y funciones amigas que no sean de plantilla. • Clases y funciones amigas de plantilla general. Informática II 2009/2

  20. Clases y funciones amigas que no sean de plantilla • Son aquellas Clases/funciones que sean declaradas amigas de las plantillas que se caracterizan por no ser plantillas. • Al no ser plantillas, estas funciones/clases deberán estar diseñadas para trabajar con instancias específicas de la plantilla. Informática II 2009/2

  21. Clases y funciones amigas que no sean de plantilla • // declare the template and the parameter • template <class T> • class Array // the class being parameterized • { • public: • Array(); • // full class declaration here • // friend function • friend void Intrude(Array<int>); • }; Informática II 2009/2

  22. Clases y funciones amigas que no sean de plantilla • // Función amiga. No es una plantilla, sólo puede //ser usada con arreglos tipo int ! • void Intrude(Array<int> theArray) • { • cout << endl << "*** Intrude ***" << endl; • for (inti = 0; i < theArray.itsSize; i++) • cout << "i: " << theArray.pType[i] << endl; • cout << endl; • } Informática II 2009/2

  23. Clases y funciones amigas de plantilla general • Son aquellas Clases/funciones que sean declaradas amigas de las plantillas que a su vez sean plantillas. • Al ser plantillas, podrán utilizar cualquier tipo al que se instancie la plantilla que la ha declarado como amiga. Informática II 2009/2

  24. Plantillas • Los elementos de plantillas pueden ser tratados de la misma forma que cualquier otro tipo • Pueden ser pasados como parámetros, ya sea por referencia o por valor, al igual que se pueden usar para valores de retorno de funciones. Informática II 2009/2

  25. Contenido Plantillas 1 ClasesPlantillas 2 Plantillas de funciones 3 4 Librería estándar de plantillas (STL) Informática II 2011/2

  26. La librería estándar de plantillas (STL -The Standard Template Library) Informática II 2011/2

  27. La librería estándar de plantillas (STL -The Standard Template Library) • Como otros miembros del las librerías estándar de C++, STL es portable entre diferentes sistemas operativos y está incluida en el espacio de nombre estándar (std). Informática II 2011/2

  28. La librería estándar de plantillas (STL -The Standard Template Library) • El núcleo de la STL son los algoritmos, que utilizan iteradores para acceder a contenedores. • Características: • proveen un fuerte chequeo de tipos • sus iteradores son generalizaciones de los punteros • permiten el uso en algoritmos, de funciones encapsuladas en objetos • los componentes de la STL son al menos tan eficientes como los codificados a mano Informática II 2011/2

  29. Contenedores • Es un objeto que contiene otros objetos. • Estos contenedores son implementados como clases plantillas, que permiten gran flexibilidad en los tipos soportados por los elementos. • Un contenedor maneja los espacios de almacenamientos para sus elementos, y provee funciones miembro para el acceso a estos directamente o a través de los iteradores (objetos de referencia que tienen un comportamiento similar a los punteros) Algoritmo Iterador Contenedor Informática II 2011/2

  30. Categorías de contenedores Informática II 2011/2

  31. Contenedores secuenciales • Estas clases son diseñadas para brindar acceso secuencial y aleatorio a sus miembros o elementos. • Provee un acceso secuencial eficiente a la lista de objetos que contiene. La librería estándar de C++ provee tres tipos diferentes de contenedores de este tipo: • Vector • List • Deque (Doble vector, inserción adelante y atrás) Informática II 2011/2

  32. Contenedores asociativos • Son contenedores optimizados para tener acceso a sus elementos mediante valores claves. Son optimizados internamente • C++ provee tres tipos diferentes de contenedores de este tipo: • Map • Multimap • Set • Multiset Informática II 2011/2

  33. Contenedores adaptadores • Los adaptadores son en esencia, plantillas que procuran un interfaz especial para los otros tipos de contenedores. Los adaptadores “adaptan” o “adecúan” un determinado contenedor para que adopte un nuevo comportamiento, restringiendo ciertas características y cambiando otras. • stack • queue • priority_queue Informática II 2011/2

  34. Iterador Informática II 2011/2

  35. Iterador Informática II 2011/2

  36. Iterator • // vector::begin • #include <iostream> • #include <vector> • using namespace std; • int main () • { • vector<int> myvector; • for (inti=1; i<=5; i++) myvector.push_back(i); • vector<int>::iterator it; • cout << "myvector contains:"; • for ( it=myvector.begin() ; it < myvector.end(); it++ ) • cout << " " << *it; • cout << endl; • return 0; • } Informática II 2011/2

  37. Iterator • // vector::rbegin/rend • #include <iostream> • #include <vector> • using namespace std; • int main () • { • vector<int> myvector; • for (inti=1; i<=5; i++) myvector.push_back(i); • cout << "myvector contains:"; • vector<int>::reverse_iteratorrit; • for ( rit=myvector.rbegin() ; rit < myvector.rend(); ++rit ) • cout << " " << *rit; • cout << endl; • return 0; • } Informática II 2011/2

  38. Algoritmos • Cada contenedor define operaciones para manipular así mismo y a sus elementos, implementar todas estas operaciones por cuenta propia, puede ser muy engorroso y posiblemente se comentan errores en el proceso. Debido a que casi todas estas operaciones son similares para cualquier tipo de elementos almacenados, un conjunto de algoritmos genéricos ya incluidos en STL pueden ser utilizados directamente. • Algunos de los algoritmos más comúnmente utilizados: Informática II 2011/2

  39. Algoritmos • #include <iostream> • #include <algorithm> • #include <vector> • using namespace std; • int main () { • intmyints[]={10,20,30,40,50,60,70}; • vector<int> myvector; • vector<int>::iterator it; • myvector.resize(7); // allocate space for 7 elements • copy ( myints, myints+7, myvector.begin() ); • cout << "myvector contains:"; • for (it=myvector.begin(); it!=myvector.end(); ++it) • cout << " " << *it; • cout << endl; • return 0; • } Informática II 2011/2

  40. #include <iostream> • #include <algorithm> • #include <vector> • using namespace std; • void myfunction (inti) { • cout << " " << i; • } • structmyclass { • void operator() (inti) {cout << " " << i;} • } myobject; Algoritmos • int main () { • vector<int> myvector; • myvector.push_back(10); • myvector.push_back(20); • myvector.push_back(30); • cout << "myvector contains:"; • for_each (myvector.begin(), myvector.end(), myfunction); • cout << "\nmyvector contains:"; • for_each (myvector.begin(), myvector.end(), myobject); • cout << endl; • return 0; • } Informática II 2011/2 Informática II 2011/2 41

  41. GRACIAS POR SU ATENCIÓN Informática II 2011/2

  42. Bibliografía • Pagina de Referencia lenguaje C++: • http://www.cplusplus.com/reference/iostream/ • http://newdata.box.sk/bx/c/htm/ch16.htm#Heading49 • SamsTeach yourselft C++ in 21 days: http://newdata.box.sk/bx/c/htm/ch20.htm#Heading1 Informática II 2011/2

  43. Gracias ! Informática II 2009/2

More Related