• Non ci sono risultati.

La Standard Template Library

N/A
N/A
Protected

Academic year: 2021

Condividi "La Standard Template Library"

Copied!
15
0
0

Testo completo

(1)

La Standard Template Library

vettori, liste, mappe, ….

find, replace, reverse, sort, ….

puntatori intelligenti

• 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)

(2)

2

• 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.

Contenitori

(3)

• 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

Iteratori (puntatori intelligenti)

(4)

4

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

(5)

Vector

1 2 ... 9

begin() end()

p p p p p

0

push_back()

++

p

• Le locazioni di memoria sono contigue

– Accesso casuale, veloce l’accesso agli elementi, lenti inserimento ed estrazione

(6)

6

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

(7)

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

(8)

8

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)

(9)

Algoritmi

(#include <algorithm>)

• Gli algoritmi sono delle funzioni globali capaci di agire su contenitori differenti

• 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.

find

count copy

max_element sort

min_element

(10)

10

Algoritmi

Possono essere applicati a tutti i contenitori (o quasi)

 sort (it1, it2); // ordina un vettore (non vale per le liste) //dall’iteratore it1 all’iteratore it2

 reverse (it1, it2); // inverte un vettore da it1 a it2

 it_trov=find (it1,it2,5) // cerca il 5 da it1 a it2. Se lo trova restituisce // l’iteratore, altrimenti restituisce v.end()

it_max=max_element (it1,it2) // restituisce l’iteratore che punta al // massimo del vettore

it_min=min_element (it1,it2) // 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)

(11)

val

nodo

next prev

List

• Le locazioni di memoria non sono contigue

– Lenta la ricerca, veloci inserimento ed estrazione

...

list top

val

nodo

next prev

val

nodo

next prev

bottom

(12)

12

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

(13)

#include < >

#include <algorithm>

#include <iostream>

int main() {

<int> container;

int val;

for (int i=0; i<10; i++) {

val = (int)((float)rand()/RAND_MAX*10);

container.push_back(val); } <int>::iterator it1;

for ( it1=container.begin(); it1!=container.end();

it1++)

cout << "vector : " << *it1 << endl;

return 0;

Esempio uso sequenze

vector vector

vector

list list

list

(14)

14

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

(15)

#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;

}

Esempio uso contenitori associativi

Riferimenti

Documenti correlati

Nel corso di questo lavoro di tesi si è cercato di mettere a punto un processo per la realizzazione di microstrutture metalliche più semplice ed economico rispetto a quelli

Per misurare lo spettro Compton, la lettura dell’ampiezza di impulso nel cristal- lo pu`o essere comandata dalla coincidenza tra il segnale dell’elettrone di rinculo nello

Al contrario, una cattiva gestione del terreno e il ricorso a pratiche agricole non sostenibili fanno sì che il carbonio presente nel suolo venga rilasciato nell’atmosfera

Richiesta di adesione delle emittenti alla trasmissione dei messaggi autogestiti gratuiti relativi alle campagne per le elezioni comunali e provinciale della Regione Sicilia

For find_end(For first1, For last1, For first2, For last2, BinPred P) idem, cfr con P For search_n(For first, For last, int n, const T&amp; val) cerca val ripetuto n volte nella

• Nella STL sono disponibili una vasta collezione di classi template e funzioni che contengono algoritmi e utility generiche. • Un esempio tipico sono i contenitori template

• Gli iteratori sono dei puntatori agli elementi di un contenitore e ci permettono di muoverci all’interno di esso:.. – Iteratori monodirezionali: Permettono di accedere

 Il salto non locale avviene tramite la funzione longjmp che ripristina lo stato antecedente alla chiamata a setjmp utilizzando i dati memorizzati in jmp_buf: quindi l’esecuzione