EL LENGUAJE C++(Templates)
Técnicas Fundamentales de
Simulación, Reconstrucción y
Análisis de Datos en Física
Experimental de Partículas
Isidro González Caballero (Universidad de Oviedo)
Valencia, 07-11/05/20102
55
Templates (plantillas)
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) como a clases (class templates)
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
2
Function Templates
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 nombretemplate <class tipo> f(tipo a, int b,…);template <typename tipo> f(tipo a, int b, …);
Muy útiles para algoritmos de ordenación: Min/Max, Qsort,… El “tipo” solo tiene que tener el operador < definido
Puede haber más de un meta-tipo:template <class t1, class t2> f(t1 a, t2 b,…);
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
3
//Funcion templatetemplate <class Tipo> Tipo Min(Tipo n1, Tipo n2) { return (n1 < n2) ? n1 : n2;}//Usoint iminimo = Min<int>(10,20); //ó Min(10,20) iminimo == 10double rminimo = Min(3.14, 1.22); //rminimo == 1.22
//Ejemplo con 2 meta-tipostemplate <class T1, class T2> T1 Min (T1 n1, T2 n2) { return (n1 < n2) ? n1 : n2;}//Usoint j;long int largo;…int minimo = Min<int, long int> (j,largo); //Tanto esta forma como la siguienteint minimo = Min (j,largo); //son equivalentes
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
4
Class templates
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 MiClase {public: MiClase(…); ~MiClase(); Tipo foo(…);protected: Tipo* atributo;};
template <class Tipo> MiClase<Tipo>::MiClase(…) {…}
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
5
Templates: Ejemplo
template <class Tipo2> Array<Tipo2>::Array(int size) { elArray = new Tipo2[size];}template <class Tipo2> Array<Tipo2>::~Array(int size) { delete[] elArray;}template <class Tipo2> Tipo2& Array<Tipo2>:: operator[](int i) { return elArray[i];}
Dec
lara
ción
Imp
lem
enta
ción
template <class Tipo2> class Array {public: Array(int size); virtual ~Array() {delete[] elArray;} Tipo2& operator[](int i);protected: Tipo2* elArray;};
Todo en el mismo fichero (header, .hh)
Cada vez que se utilice se genera todo el código para el tipo correspondiente
//Array de enteros de dimensión 4Array<int> ia(4);
//Array de complejos de dim sizeArray<Complex> ClA(size);
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
6
Ejemplo y Ejercicios:
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
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
7
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
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
8
STL - Colecciones
Secuencias: Vectores unidimensionales
(vector) Inserta al final Listas doblemente enlazadas
(list) Inserta/borra en cualquier punto
deque Inserta/borra al principio/final
Contenedores asociativos Ordenados (set y multiset)
Búsqueda rápida Desordenados (map y multimap) Inserción más rápida
Cadenas de caracteres (string)
…
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
9
STL: Iteradores
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 Con dos iteradores podemos definir un rango dentro de
una colección sobre el que aplicar, por ejemplo, un determinado algoritmo.
Son típicamente: 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
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
10
STL: Algoritmos y objetos función 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
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
11
STL: Ejemplo de utilización
#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;}
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
12
Ejercicio avanzado
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.cplusplus.com/reference/algorithm/s
ort/Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
13