5 - C++ templates - Universidad de Oviedo

Download Report

Transcript 5 - C++ templates - Universidad de Oviedo

Técnicas Fundamentales de Simulación,
Reconstrucción y Análisis de Datos en
Física Experimental de Partículas
5
EL LENGUAJE C++
(Templates)
Isidro González Caballero (Universidad de Oviedo)
Valencia, 07-11/05/20102
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) como a
clases (class templates)
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
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
template <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
4
//Funcion template
template <class Tipo> Tipo Min(Tipo n1, Tipo n2) {
return (n1 < n2) ? n1 : n2;
}
//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 T1, class T2> T1 Min (T1 n1, T2 n2) {
return (n1 < n2) ? n1 : n2;
}
//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
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
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 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
Templates: Ejemplo
Implementación
Declaración
6
template <class Tipo2> class Array {
public:
Array(int size);
virtual ~Array() {delete[] elArray;}
Tipo2& operator[](int i);
protected:
Tipo2* elArray;
};
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];
}

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 4
Array<int> ia(4);
//Array de complejos de dim size
Array<Complex> ClA(size);
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
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

Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
STL (Standard Template Library)
8

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
STL - Colecciones
9

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
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
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
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

Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
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;
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas
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.cplusplus.com/reference/algorithm/sort/
Téc. Fund. de Simulación, Reconstrucción y Análisis de datos en F. Exp. de Partículas