Title: El Lenguaje C (Templates)
1El Lenguaje C(Templates)
- Técnicas Fundamentales de Simulación,
Reconstrucción y Análisis de Datos en Física
Experimental de Partículas
5
Isidro González Caballero (Universidad de
Oviedo) Valencia, 07-11/05/20102
2Templates (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)
3Function 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
ltclass tipogt f(tipo a, int b,)template
lttypename tipogt f(tipo a, int b, ) - Muy útiles para algoritmos de ordenación
- Min/Max, Qsort,
- El tipo solo tiene que tener el operador lt
definido - Puede haber más de un meta-tipotemplate ltclass
t1, class t2gt f(t1 a, t2 b,)
4- //Funcion template
- template ltclass Tipogt Tipo Min(Tipo n1, Tipo n2)
- return (n1 lt n2) ? n1 n2
-
- //Uso
- int iminimo Minltintgt(10,20) //ó Min(10,20)
iminimo 10 - double rminimo Min(3.14, 1.22) //rminimo
1.22 - //Ejemplo con 2 meta-tipos
- template ltclass T1, class T2gt T1 Min (T1 n1, T2
n2) - return (n1 lt n2) ? n1 n2
-
- //Uso
- int j
- long int largo
-
- int minimo Minltint, long intgt (j,largo)
//Tanto esta forma como la siguiente - int minimo Min (j,largo) //son
equivalentes
5Class 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 ltclass Tipogt class MiClase public
MiClase() MiClase() Tipo
foo() protected Tipo atributo template
ltclass Tipogt MiClaseltTipogtMiClase()
6Templates Ejemplo
- Todo en el mismo fichero (header, .hh)
- Cada vez que se utilice se genera todo el código
para el tipo correspondiente
template ltclass Tipo2gt class Array public Array(int size) virtual Array() delete elArray Tipo2 operator(int i) protected Tipo2 elArray
Declaración
template ltclass Tipo2gt ArrayltTipo2gtArray(int size) elArray new Tipo2size template ltclass Tipo2gt ArrayltTipo2gtArray(int size) delete elArray template ltclass Tipo2gt Tipo2 ArrayltTipo2gt operator(int i) return elArrayi
//Array de enteros de dimensión 4 Arrayltintgt
ia(4) //Array de complejos de dim
size ArrayltComplexgt ClA(size)
Implementación
7Ejemplo 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
8STL (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
9STL - 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)
-
10STL 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() collectio
n.end() - Existen distintos tipos de iteradores forward,
bidireccionales, entrada, salida
11STL 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
12STL Ejemplo de utilización
- include ltiostreamgtinclude ltvectorgtinclude
ltstringgt - using namespace stdint main()
vectorltstringgt SS SS.push_back("The number is
10") SS.push_back("The number is 20")
SS.push_back("The final number is 30") cout
ltlt "Loop by index" ltlt endl for (unsigned int
ii0 ii lt SS.size() ii) cout ltlt SSii ltlt
endl - cout ltlt endl ltlt "Constant Iterator" ltlt endl
vectorltstringgtconst_iterator cii for
(ciiSS.begin() cii!SS.end() cii) cout
ltlt cii ltlt endl
13Ejercicio 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/