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