Template Esempio di template di funzione Esempio di

Transcript

Template Esempio di template di funzione Esempio di
Template
™ I Template sono un meccanismo che permette
di definire funzioni e classi basate su
argomenti e oggetti dal tipo non specificato
Costruzione di Interfacce
Lezione 12
C++STL
template class <T> swap(T &a, T &b);
template class <T> class List {...};
[email protected]
http://vcg.isti.cnr.it/~cignoni
™ Queste funzioni e oggetti generici diventano
codice completo una volta che le loro
definizioni sono usate con oggetti reali
26 oct 2003
Esempio di template di funzione
Punto 3D generico:
template <class T>
class Point3 {
public:
T v[3];
Point3 operator + ( Point3 const & p) const {
return Point3(v[0]+p.v[0],v[1]+p.v[1],v[2]+p.v[2] );
}
Point3 & operator =( Point3 const & p ){
v[0]= p.v[0]; v[1]= p.v[1]; v[2]= p.v[2];
return *this;
}
};
template <class T> void swap(T &a, T &b){
T tmp = a;
a = b;
b = tmp;
}
int main(){
int a = 3, b = 16;
double d = 3.14, e = 2.17;
swap(a, b);
swap(d, e);
// swap (d, a); errore in compilazione!
int main(){
Point3<float> a1(0,0,0),a2(1,2,3);
Point3<int> b(1,1,1);
a1=a1+a2; //ok
a1=b+a2; ///
error!!
return (0);
}
return (0);
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
3
26 oct 2003
Template Osservazioni
™ Il fatto che il compilatore generi codice concreto solo
una volta che una funzione è usata ha come
conseguenza che una template function non può essere
mai raccolta in una libreria a run time
™ Un template dovrebbe essere considerato come una
sorta di dichiarazione e fornito in un file da includere.
™ Quando da un template si genera codice per un certo
specifico tipo si dice che si è istanziato quel template
per quel tipo
Costruzione di Interfacce - Paolo Cignoni
Costruzione di Interfacce - Paolo Cignoni
4
Namespace
™ Notare che la definizione di una funzione template è
simile ad una macro, nel senso che la funzione template
non è ancora codice, ma lo diventerà una volta che essa
viene usata
26 oct 2003
2
Esempio di template di classe
Scambio tra due oggetti generici:
}
Costruzione di Interfacce - Paolo Cignoni
5
™Lo spazio dei nomi delle classi e delle
funzioni globali è unico.
™Per questo motivo i venditori di librerie
e di classi di solito danno nomi lunghi e
con vari prefissi che li rendano non
ambigui (e.g. SQL_Acc_Start(…))
™In c++ lo spazio globale dei nomi è
scomponibile in blocchi usando i
namespace
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
6
1
Namespace
Namespace use
namespace MyLib
{
class myClass {…};
}
int main()
{
myLib::myClass p;
}
™Per accedere ai nomi definiti in un
namespace
™Direttiva using
Using namespace myLib;
myClass p
™ Nota
™Risolutore di Scope ::
™ Namespace possono apparire solo nello scope
globale (non dentro una classe o una funz),
™ possono essere nested
™ Un namespace puo continuare in file diversi (non è
quindi una ridefinizione).
™ Non ci vuole il ‘;’ in fondo
26 oct 2003
myLib::myClass p
Costruzione di Interfacce - Paolo Cignoni
7
26 oct 2003
STL: Standard Template Library
Costruzione di Interfacce - Paolo Cignoni
8
STL Container
™Libreria di classi container, algoritmi,
iteratori che mette a disposizone in
forma astratta e generica (basata su
template) la maggior parte degli
algoritmi e strutture dati “classici”
™Liste, insiemi ordinati, vettori, hash, code di
priorità, stack ecc.
™Sort, permutazioni, ricerche binarie, ecc
™I container sono tipi di dato astratti in
cui è possibile meomorizzare e ritrovare
informazione.
™Templated sul tipo dell’oggetto da
memorizzare
™Possono essere sequenziali, ad accesso
casuale, associativi, ordinati ecc…
™Tutte le entità della STL sono definite
nel namespace ‘std’
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
9
26 oct 2003
STL Containers
™Usato per memorizzare una coppia di
elementi senza aver bisogno di fare una
classe apposita.
™ overloaded assignment operator
™ Tests uguaglianza: == and !=
™ Ordering operators: <, <=, > and >=.
L’ operatore < ritorna true se ogni elemento del
primo e minore del corrispndente elemento del
secondo container.
#include <utility>
using namespace std;
pair<string, string>
piper("PA28", "PH-ANI"),
cessna("C172", "PH-ANG");
cout << piper.first << endl << // shows 'PA28'
™ Per poter istanziare un contenitore su di un
certo tipo esso deve avere:
™ A default-value (e.g., a default constructor)
™ The equality operator ( ==)
™ The less-than operator ( <)
Costruzione di Interfacce - Paolo Cignoni
10
pair
™ Tutti i container supportano:
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
cessna.second << endl; // shows 'PH-ANG'
11
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
12
2
Vector
vector
™Implementa un array resizable
™Costruttori tipici e init
™
™
™
™
™
™Accesso
™ Operator[]
A[3]=5; // Nota: è responsabilità
// dell’utente non uscire dal vettore;
™ A.back() è un riferimento all’ultimo elemento
™ A.begin() iteratore al primo
™ A.end() iteratore al primo dopo l’ultimo
#include <vector>
vector<int> A;
A.resize(10);
vector<int> B(4);
vector<float> C(10,0.1f);
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
13
26 oct 2003
iteratori
™ Scansione di un container con iteratori
™ vector<int>::iterator it;
™ list<myClass *>:iterator li;
vector<myClass> V;
…
vector<myClass>::iterator vi;
for(vi=V.begin();vi!=V.end();++vi)
doSomething(*ii);
™ Dato un iteratore iter
™ *iter rappresenta l’oggetto a cui l’iteratore punta
™ ++iter fa avanzare l’iteratore nel contenitore in maniera
ragionevole
™ Se il contenitore è di tipo con accesso casuale vale anche
l’aritmetica dei puntatori (iter+10 avanza di 10 posizioni)
™ Usati di solito per indicare range in un container in
maniera inclusiva a sx
[first,last) indica un range di elementi in un container da
first (incluso) a last (escluso);
Costruzione di Interfacce - Paolo Cignoni
list <myClass> L;
…
list<myClass>::iterator li;
for(li=L.begin();li!=L.end();++li)
doSomething(*li);
™ Sempre nello stesso modo per tutti i container!
15
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
Tipico uso iteratori
™Aggiunta di elementi nel vettore
Vector<myObj> V;
myObj obj;
V.push_back(obj);
vector<myClass> V;
sort(V.begin(), V.end());
™Nota:
reverse(V.begin(), V.end());
™Costo: ammortizzato costante;
™L’allocazione di memoria è gestita in
maniera trasparente (fa il resize quando
serve raddoppiando la size).
™Il vettore contiene gli oggetti, quindi si
memorizza in V una copia di obj
™ Nota [first,last) indica un range di elementi in un
container da first (incluso) a last (escluso);
™ end() è il primo oltre la fine del container e quindi è
sempre non accedibile!!!
Costruzione di Interfacce - Paolo Cignoni
16
vector
™Definizione di un range con iteratori
26 oct 2003
14
Tipico uso iteratori
™ Astrazione del concetto di puntatore.
™ Sempre riferiti ad un istanza di un certo container:
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
17
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
18
3
vector
list
™Elementi possono essere aggiunti anche
in altre posizioni ma con costo lineare
nella grandezza del vettore;
™Operatori utili
™ resize(int) (nota che non disalloca…)
™ reserve(int)
™ capacity()
26 oct 2003
™ Il container list implementa
una generica double linked
list
™ Operazioni di inserzione,
cancellazione in posizione
qualsiasi in tempo costante
™ Persistenza degli oggetti nel
container in memoria
™ Iteratori agli elementi della
lista restano validi a lungo…
Costruzione di Interfacce - Paolo Cignoni
19
26 oct 2003
map
Costruzione di Interfacce - Paolo Cignoni
20
Altri container utili
™Implementa un array associativo
ordinato
™queue
™set
™stack
™hash e hashmap
™ map<key, value> object;
™Permette di accedere ad un insieme di
oggetti per contenuto.
™ operator[] ridefinito per accedere per key
map<string,int> si;
si[“pippo”]=42;
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
21
26 oct 2003
Esempio di classe template
Costruzione di Interfacce - Paolo Cignoni
STL algorithms
™Classe per la rappresentazione generica
di un punto in uno spazio 3D,
templatato sul tipo usato per tenere I
valori delle coordinate.
™Point3<float>
™Overload di tutti gli operatori sensati.
™Sui container visti finora nelle stl sono
definiti un lunga serie di algoritmi
generici che permettono di fare azioni
comuni piu’o meno semplici.
26 oct 2003
26 oct 2003
Costruzione di Interfacce - Paolo Cignoni
22
23
Costruzione di Interfacce - Paolo Cignoni
24
4
STL algorithms: Non mutating
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
STL algorithms: Mutating
1.
2.
3.
for_each
find
find_if
adjacent_find
find_first_of
count
count_if
mismatch
equal
search
search_n
find_end
26 oct 2003
copy
copy_n
Swap
1.
2.
3.
4.
4.
Costruzione di Interfacce - Paolo Cignoni
25
swap
iter_swap
swap_ranges
transform
Replace
1.
2.
3.
4.
5.
6.
7.
8.
1.
replace
replace_if
replace_copy
replace_copy_if
fill
fill_n
generate
generate_n
26 oct 2003
Remove
1.
2.
3.
4.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
remove
remove_if
remove_copy
remove_copy_if
unique
unique_copy
reverse
reverse_copy
rotate
rotate_copy
random_shuffle
random_sample
random_sample_n
partition
stable_partition
Costruzione di Interfacce - Paolo Cignoni
26
STL algorithms: Sorting
1.
Sort
1.
2.
3.
4.
5.
2.
3.
nth_element
Binary search
1.
2.
3.
4.
4.
5.
1.
sort
stable_sort
partial_sort
partial_sort_copy
is_sorted
lower_bound
upper_bound
equal_range
binary_search
merge
inplace_merge
26 oct 2003
Set operations on sorted ranges
1.
2.
3.
4.
5.
2.
Heap operations
1.
2.
3.
4.
5.
3.
includes
set_union
set_intersection
set_difference
set_symmetric_difference
push_heap
pop_heap
make_heap
sort_heap
is_heap
Minimum and maximum
1.
2.
3.
4.
min
max
min_element
max_element
Costruzione di Interfacce - Paolo Cignoni
27
5