La Standard Template Library La libreria standard STL
La Standard Template Library • La libreria standard STL e’ una libreria di classi di contenitori, algoritmi ed iteratori. • STL e’ una libreria generica: tutti i suoi componenti sono parametrizzati (possono essere applicati a qualsiasi tipo, anche creato dall’utente) puntatori intelligenti vettori, liste, mappe, …. find, replace, reverse, sort, ….
Contenitori • Un contenitore è un oggetto capace di immagazzinare altri oggetti e che possiede metodi per accedere ai suoi elementi. – Ogni contenitore ha un iteratore associato che permette di muoversi tra gli elementi contenuti – Una sequenza è un contenitore di lunghezza variabile i cui elementi sono organizzati linearmente. E’ possibile aggiungere e rimuovere elementi – Un contenitore associativo è una sequenza che permette un efficiente accesso ai suoi elementi basato su una chiave.
Iteratori (puntatori intelligenti) • Gli iteratori sono dei puntatori agli elementi di un contenitore e ci permettono di muoverci all’interno di esso: – Iteratori monodirezionali: Permettono di accedere all’elemento successivo o al precedente – Iteratori bidirezionali : Permettono di accedere sia all’elemento successivo che al precedente – Iteratori ad accesso casuale : Permettono di accedere ad un qualunque elemento del contenitore
Sequenze • Vector (#include <vector>) – Tempo costante di inserimento e cancellazione di elementi all’inizio e alla fine del vettore. – Tempo lineare con il numero di elementi per inserimento e cancellazione di elementi all’interno del vettore – Iteratore ad accesso casuale • List (#include <list>) – Tempo costante di inserimento e cancellazione di elementi in ogni punto della lista – Iteratore bidirezionale
Vector begin() end() 0 1 2 . . . 9 ++ p p push_back() p • Le locazioni di memoria sono contigue – Accesso casuale, veloce l’accesso agli elementi, lenti inserimento ed estrazione
Vector (dichiarazioni) Si dichiara: Ø Ø vector<int> v; // dichiara un vettore vuoto di interi vector<Razionale> v; // vettore di razionali vector<int> v(7); // vettore di 7 interi vector<int> v(5, 3); // vettore di 5 interi tutti uguali a 3 Ø v. size() // dimensione del vettore Ø // si può usare normalmente v[i] per accedere agli elementi
Vector (iteratori) Un iteratore è un puntatore ad un elemento del vector. Dichiarazione: Ø vector<int>: : iterator it; // dichiara un iteratore di un vettore di interi Ø vector<int>: : reverse_iterator it; // dichiara un iteratore inverso Ø vector<int>: : const_iterator it; // dichiara un iteratore di un vettore costante di interi it++ (avanza di un elemento o retrocede nel caso di iteratori inversi) It-- (retrocede di un elemento o avanza nel caso di iteratori inversi) v. begin() // restituisce l’iteratore al primo elemento del vettore v. end() // restituisce l’it. al successivo dell’ultimo del vettore *it // restituisce l’oggetto puntato da it it=(it. begin()+it. end())/2; restituisce l’it. all’elemento medio v. rbegin() v. rend() //restituiscono gli iteratori inversi all’ultimo e all’elemento precedente il primo
Vector (metodi) Il vector può avere dimensione variabile. Ø v. push_back(5); // inserisce 5 alla fine del vettore (la dimensione sarà // aumentata di uno) Ø v. pop_back() // cancella l’ultimo elemento(la dimensione sarà // diminuita di uno) Ø v. insert (it, 18); // inserisce 18 nella posizione precedente all’iteratore Ø v. erase (it); // cancella l’elemento nella posizione dell’iteratore // (l’iteratore viene spostato all’elemento successivo)
Algoritmi (#include <algorithm>) • Gli algoritmi sono delle funzioni globali capaci di agire su contenitori differenti find max_element count copy sort min_element • Sono incluse operazioni di ordinamento (sort, merge, min_element, max_element. . . ), di ricerca (find, count, equal. . . ), di trasformazione (transform, replace, fill, rotate, shuffle. . . ), e varie altre operazioni.
Algoritmi Possono essere applicati a tutti i contenitori (o quasi) Ø sort (it 1, it 2); Ø Ø // ordina un vettore (non vale per le liste) //dall’iteratore it 1 all’iteratore it 2 reverse (it 1, it 2); // inverte un vettore da it 1 a it 2 it_trov=find (it 1, it 2, 5) // cerca il 5 da it 1 a it 2. Se lo trova restituisce // l’iteratore, altrimenti restituisce v. end() it_max=max_element (it 1, it 2) // restituisce l’iteratore che punta al // massimo del vettore it_min=min_element (it 1, it 2) // restituisce l’iteratore che punta al // minimo del vettore L’elenco completo lo trovate sul Libro di testo in Appendice. Gli algoritmi funzionano anche sugli array standard (basta passare i puntatori invece degli iteratori)
List nodo val list next top bottom prev . . . nodo val next prev • Le locazioni di memoria non sono contigue – Lenta la ricerca, veloci inserimento ed estrazione
List list<int> l; //dichiarazione Ø Agli iteratori non possono essere applicate operazioni aritmetiche (es. it=(l. begin()+l. end())/2; ) Ø l. sort(); // ordina una lista Ø l. reverse() // inverte una lista
Esempio uso sequenze list > #include <vector #include <algorithm> #include <iostream> int main() { vector list <int> container; int val; for (int i=0; i<10; i++) { val = (int)((float)rand()/RAND_MAX*10); container. push_back(val); } vector list <int>: : iterator it 1; for ( it 1=container. begin(); it 1!=container. end(); it 1++) cout << "vector : " << *it 1 << endl; return 0; }
Contenitori associativi • Sono contenitore di coppie ( key, value ) e possiedono un iteratore bidirezionale • map – Viene richiesto l’operatore < per la chiave – Gli elementi sono ordinati secondo la chiave
Esempio uso contenitori associativi #include <map> #include <algorithm> #include <iostream> #include <string> int main() { map<string, int> amap; amap["Primo”]=1; amap[“Secondo”]=2; cout << "Size : " << amap. size() << endl; amap["Terzo"]=3; amap["Quarto"]=4; cout << "Size : " << amap. size() << endl; map<string, int>: : iterator it; for ( it=amap. begin(); it!=amap. end(); it++) cout << "map : " << it->first << " " << it->second << endl; cout << amap. find("Terzo")->second << endl; return 0; }
- Slides: 15