Seminario STL

Transcript

Seminario STL
Autore: E. Stefanini
Data: 16/03/2006
Annesso A3 – Pag. 1/3
Viene introdotto un argomento che da molti è considerato la più importante aggiunta al linguaggio C++ degli
ultimi anni: la libreria STL (Standard Template Library). La creazione della libreria STL è stato uno degli sforzi
più ingenti svoltisi durante la standardizzazione del C++. Tale libreria fornisce classi template di utilizzo
generale, funzioni che implementano algoritmi e strutture dati di uso comune comprendendo, ad esempio, il
supporto di vettori, liste, code e stack. Inoltre la libreria STL definisce varie routine di accesso a tali elementi.
Poiché la libreria STL si basa su classi template, gli algoritmi e le strutture dati possono essere applicate
praticamente a ogni tipo di dati. La libreria STL è un elemento software complesso che utilizza alcune delle
funzionalità più avanzate del linguaggio C++. Per comprendere e utilizzare al meglio la libreria STL è dunque
opportuno conoscere al meglio il linguaggio C++ e soprattutto il funzionamento dei puntatori, degli indirizzi e
dei template
Francamente, la sintassi template che descrive la libreria può inizialmente intimorire (anche se il tutto sembra
molto più complicato di quanto non sia in realtà); non ci si deve sorprendere o scoraggiare se inizialmente si
trova che l'argomento sembra essere confuso. Basta pazientare e studiare gli esempi evitando che la sintassi
poco familiare distragga dalla semplicità di base della libreria.
Si vuole presentare una panoramica della libreria STL partendo dalla filosofia progettuale, dall'organizzazione,
dagli elementi di base e dalle tecniche di programmazione.
Anche se la libreria STL è molto estesa e la sua sintassi può inizialmente spaventare, è molto facile utilizzarla
se si comprende il modo in cui è costruita e quali sono gli elementi da essa impiegati. Pertanto, prima di
offrire degli esempi di codice, è opportuno presentare una panoramica della libreria STL.
Il nucleo della libreria STL è costituito da tre elementi: container, algoritmi e iteratori. Questi elementi
collaborano fra loro per fornire soluzioni pronte all'uso per vari problemi di programmazione.
Container
I container sono oggetti che contengono altri oggetti; la libreria offre container di vari tipi. Ad esempio, la classe
vector definisce un array dinamico, deque crea una coda a doppio concatenamento e list fornisce una lista
lineare. Questi container sono chiamati container sequenziali poiché nella terminologia STL una sequenza è
una lista lineare. Oltre ai container di base, la libreria definisce anche dei container associativi che consentono di
ricercare in modo efficiente un valore sulla base di una chiave. Ad esempio, un container map fornisce
l'accesso a valori tramite chiavi univoche. Pertanto una mappa memorizza coppie chiave/valore e consente di
trovare un valore sulla base della sua chiave.
Ogni classe container definisce una serie di funzioni specifiche per il container stesso. Ad esempio, un container
per liste include le funzioni di inserimento, cancellazione e unione degli elementi. Un container stack include le
funzioni di inserimento (push) ed estrazione (pop) dei valori.
Autore: E. Stefanini
Data: 16/03/2006
Annesso A3 – Pag. 2/3
Gli algoritmi
Gli algoritmi operano su container. Essi rappresentano il mezzo tramite il quale è possibile manipolare il
contenuto dei container. Fra le funzionalità offerte dagli algoritmi vi è dell'inizializzazione, l'ordinamento, la
ricerca e la trasformazione del contenuto dei container. Molti algoritmi operano su un intervallo di elementi di
un container.
Gli iteratori
Gli iteratori sono oggetti strettamente imparentati con i puntatori. Essi danno la possibilità di attraversare il
contenuto di un container un po' come un puntatore consente di attraversare un array. Vi sono cinque tipi di
iteratori.
In generale, un iteratore che ha maggiori capacità di accesso può essere utilizzato in luogo di uno che è dotato
di minori capacità di accesso. Ad esempio, al posto di un iteratore di input si può utilizzare un iteratore in
avanti.
Gli iteratori vengono gestiti come i puntatori. Dunque è possibile incrementarli e decrementarli. Agli iteratori si
può applicare l'operatore *. Gli iteratori vengono dichiarati utilizzando il tipo iterator definito dai vari container.
La libreria STL supporta anche gli iteratori inversi. Gli iteratori inversi sono iteratori bidirezionali o ad accesso
diretto che si muovono lungo una sequenza in direzione inversa. Pertanto, se un iteratore inverso punta alla fine
di una sequenza, incrementando tale iteratore si farà in modo che esso punti al penultimo elemento.
Allocatori, predicati, funzioni di confronto e oggetti funzione
Oltre ai container, agli algoritmi e agli iteratori, la libreria STL si basa su molti alìri componenti standard. Fra i
principali vi sono gli allocatori, i predicati, le funzioni di confronto e ogni oggetto funzione.
Per ogni container è definito un allocatore. Gli allocatori gestiscono l'allocazione della memoria per un
container. L'allocatore standard è un oggetto della classe allocator ma per applicazioni particolari è possibile
definire allocatori specifici. Per la maggior parte degli usi si impiega l'allocatore standard.
Molti degli algoritmi e container usano tipi speciali di funzioni chiamati predicati. Vi sono due tipi di predicati:
unari e binari. Un predicato unario accetta un argomento mentre un predicato binario ne accetta due. Queste
funzioni restituiscono un risultato true o false. Le condizioni che provocano la restituzione di un valore true o
false sono definite dal programmatore. In un predicato binario, gli argomenti sono sempre in ordine (primo,
secondo). Per predicati unari e binari gli argomenti contengono valori appartenenti al tipo degli oggetti
contenuti nel container.
Autore: E. Stefanini
Data: 16/03/2006
Annesso A3 – Pag. 3/3
Alcuni algoritmi e alcune classi usano un tipo particolare di predicato binario che confronta due elementi. Le
funzioni di confronto restituiscono true se il primo argomento è minore del secondo.
Oltre agli header richiesti dalle varie classi STL, la libreria standard C++ include i file header <utility> e
<functional> che forniscono il supporto per la libreria STL. Ad esempio, la classe template pair che contiene una
coppia di valori è definita in <utility>.
I template contenuti in <functional> aiutano a costruire oggetti che definiscono operator(). Si tratta di oggetti
funzione che possono essere utilizzati al posto dei puntatori a funzione. In <functional> sono dichiarati vari
oggetti funzione.
L'oggetto funzione probabilmente più utilizzato è less che determina quando un oggetto è minore di un altro.
Gli oggetti funzione possono essere utilizzati al posto dei puntatori a funzione.
Utilizzando oggetti funzione al posto dei puntatori a funzione, la libreria STL è in grado di generare codice più
efficiente.