Tcnicas Computacionales en Fsica Mster en Fsica y

  • Slides: 13
Download presentation
Técnicas Computacionales en Física Máster en Física y Tecnologías Físicas, Máster en Computación 5

Técnicas Computacionales en Física Máster en Física y Tecnologías Físicas, Máster en Computación 5 EL LENGUAJE C++ (TEMPLATES) Isidro González Caballero (Universidad de Oviedo) Santander, 15/10/2012

Templates (plantillas) 2 El comportamiento no depende del tipo de alguno de sus: Atributos

Templates (plantillas) 2 El comportamiento no depende del tipo de alguno de sus: Atributos (clases) Argumentos (funciones y métodos) Se utilizan para: Algoritmos (ej. ordenación) Colecciones (ej. listas, conjuntos, arrays) Trucos diversos (meta-programación) Existe una librería altamente optimizada que proporciona toda esta funcionalidad: la STL (Standard Template Library) Se aplican tanto a funciones (function templates) C++ (templates) como a clases (class templates)

Function Templates 3 Funciones cuyo comportamiento no depende del tipo de alguno de sus

Function Templates 3 Funciones cuyo comportamiento no depende del tipo de alguno de sus argumentos Pueden ser funciones generales O alguno de los métodos de una clase Sintáxis: tipo es cualquier nombre Muy útiles para algoritmos de ordenación: template <class tipo> f(tipo a, int b, …); template <typename tipo> f(tipo a, int b, …); Min/Max, Qsort, … El “tipo” solo tiene que tener el operador < definido Puede haber más de un meta-tipo: template <class t 1, class t 2> f(t 1 a, t 2 b, …); C++ (templates)

4 //Funcion template <class Tipo> Tipo Min(Tipo n 1, Tipo n 2) { return

4 //Funcion template <class Tipo> Tipo Min(Tipo n 1, Tipo n 2) { return (n 1 < n 2) ? n 1 : n 2; } //Uso int iminimo = Min<int>(10, 20); //ó Min(10, 20) iminimo == 10 double rminimo = Min(3. 14, 1. 22); //rminimo == 1. 22 //Ejemplo con 2 meta-tipos template <class T 1, class T 2> T 1 Min (T 1 n 1, T 2 n 2) { return (n 1 < n 2) ? n 1 : n 2; } //Uso int j; long int largo; … int minimo = Min<int, long int> (j, largo); //Tanto esta forma como la siguiente int minimo = Min (j, largo); //son equivalentes C++ (templates)

Class templates 5 Cuando el comportamiento de la clase no depende del tipo de

Class templates 5 Cuando el comportamiento de la clase no depende del tipo de uno o más de sus atributos (data members) Colecciones: Vectores, listas, mapas… Objetos matemáticos: Matrices, Vectores, … Sintáxis: template <class Tipo> class Mi. Clase { public: Mi. Clase(…); ~Mi. Clase(); Tipo foo(…); protected: Tipo* atributo; }; template <class Tipo> Mi. Clase<Tipo>: : Mi. Clase(…) {…} C++ (templates)

Templates: Ejemplo Implementación Declaración 6 template <class Tipo 2> class Array { public: Array(int

Templates: Ejemplo Implementación Declaración 6 template <class Tipo 2> class Array { public: Array(int size); virtual ~Array() {delete[] el. Array; } Tipo 2& operator[](int i); protected: Tipo 2* el. Array; }; template <class Tipo 2> Array<Tipo 2>: : Array(int size) { el. Array = new Tipo 2[size]; } template <class Tipo 2> Array<Tipo 2>: : ~Array(int size) { delete[] el. Array; } template <class Tipo 2> Tipo 2& Array<Tipo 2>: : operator[](int i) { return el. Array[i]; } C++ (templates) l Todo en el mismo fichero (header, . hh) l Cada vez que se utilice se genera todo el código para el tipo correspondiente //Array de enteros de dimensión 4 Array<int> ia(4); //Array de complejos de dim size Array<Complex> Cl. A(size);

Ejemplo y Ejercicios: 7 Descargar template. zip Inspeccionar Array. hh y main. cc Ejercicios:

Ejemplo y Ejercicios: 7 Descargar template. zip Inspeccionar Array. hh y main. cc Ejercicios: Obligatorios: Implementar la función template Max Probar con un array de números complejos ¿Qué pasa cuando hacemos una copia? Corregirlo Opcionales: Implementar la redimensión automática del array Calcular cual es el máximo del array de enteros usando una función template C++ (templates)

8 STL (Standard Template Library) Conjunto de herramientas basadas en templates para C++ que

8 STL (Standard Template Library) Conjunto de herramientas basadas en templates para C++ que proporcionan Colecciones (estructuras de datos) Iteradores Objetos función Algoritmos. . . Se encuentran en el namespace std C++ (templates)

STL - Colecciones 9 Secuencias: Contenedores asociativos Vectores unidimensionales (vector) Inserta al final Listas

STL - Colecciones 9 Secuencias: Contenedores asociativos Vectores unidimensionales (vector) Inserta al final Listas doblemente enlazadas (list) Inserta/borra en cualquier punto deque Inserta/borra al principio/final Ordenados (set y multiset) Búsqueda rápida Desordenados (map y multimap) Inserción más rápida Cadenas de caracteres (string) … C++ (templates)

STL: Iteradores 10 Los iteradores son herramientas para iterar sobre los elementos de las

STL: Iteradores 10 Los iteradores son herramientas para iterar sobre los elementos de las colecciones anteriores (o arrays normales) Especifican una posición dentro de una colección Son típicamente: Con dos iteradores podemos definir un rango dentro de una colección sobre el que aplicar, por ejemplo, un determinado algoritmo. incrementados (siguiente posición)… … o des-referenciados (acceder a la información) Para referirnos al comienzo o al final de la colección usamos: collection. begin() collection. end() Existen distintos tipos de iteradores: forward, bidireccionales, entrada, salida C++ (templates)

STL: Algoritmos y objetos función 11 Algoritmos Operan sobre (rangos de) colecciones Incluyen Ordenación

STL: Algoritmos y objetos función 11 Algoritmos Operan sobre (rangos de) colecciones Incluyen Ordenación (sort, merge, min, max…) Búsqueda (find, count, equal…) Mutación (transform, replace, fill, rotate, shuffle…) Operaciones numéricas genéricas (accumulate, adjacent difference. . . ) Objetos función: Son objetos que tienen definida al menos un operador () Mucho algoritmos utilizan objetos función para ejecutar una determinada operación sobre un rango de objetos en una colección C++ (templates)

STL: Ejemplo de utilización 12 #include <iostream> #include <vector> #include <string> using namespace std;

STL: Ejemplo de utilización 12 #include <iostream> #include <vector> #include <string> using namespace std; int main() { vector<string> SS; SS. push_back("The number is 10"); SS. push_back("The number is 20"); SS. push_back("The final number is 30"); cout << "Loop by index: " << endl; for (unsigned int ii=0; ii < SS. size(); ii++) cout << SS[ii] << endl; } cout << endl << "Constant Iterator: " << endl; vector<string>: : const_iterator cii; for (cii=SS. begin(); cii!=SS. end(); cii++) cout << *cii << endl; C++ (templates)

Ejercicio avanzado 13 Usar la STL y llenar un vector con 1000 números aleatorios

Ejercicio avanzado 13 Usar la STL y llenar un vector con 1000 números aleatorios (usar random. org) Calcular el valor máximo y el mínimo Ordenar los números usando el algoritmo sort de la STL Para nota: Añadir un método para ordenar los objetos de la colección implementada en nuestro template usando la función sort de la STL http: //www. cplus. com/reference/algorithm/sort/ C++ (templates)