C++ templates

13
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 5

description

C++ templates

Transcript of C++ templates

Page 1: C++ templates

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

5

Page 2: C++ templates

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

Page 3: C++ templates

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

Page 4: C++ templates

//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

Page 5: C++ templates

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

Page 6: C++ templates

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

Impl

emen

taci

ó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

Page 7: C++ templates

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

Page 8: C++ templates

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

Page 9: C++ templates

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

Page 10: C++ templates

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 lainformación)

Para referirnos al comienzo o al final dela colección usamos:collection.begin()collection.end()

Existen distintos tipos de iteradores: forward, bidireccionales, entrada, salidaTéc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas

10

Page 11: C++ templates

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

Page 12: C++ templates

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

Page 13: C++ templates

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/sort

/Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas

13