Generalità sulla Libreria Standard del C++

 


 

Campi di applicazione

 

La Libreria Standard del C++ è costituita da un vasto numero di classi e funzioni che trattano principalmente di:

La programmazione generica è largamente applicata nella Libreria: infatti, nella grande maggioranza le sue classi e funzioni sono template (o specializzazioni di template). Questo fa sì che le stesse operazioni siano applicabili a una vasta varietà di tipi, sia nativi che definiti dall'utente.

In aggiunta alla Libreria Standard del C++, la maggior parte delle implementazioni offre librerie di "interfacce grafiche", spesso chiamate anche GUI (graphical user interface), con sistemi a "finestre" per l'interazione fra utente e programma. Inoltre, la maggior parte degli ambienti di sviluppo integrati fornisce librerie dette FL (foundation libraries), che supportano lo sviluppo di applicazioni in accordo con l'ambiente specifico in cui lavorano (per esempio, la MFC del Visual C++). Sia le GUI che (ovviamente) le FL non fanno parte dello standard C++ e quindi non verranno trattate in questo corso. La stessa Libreria Standard sarà considerata perlopiù "dal punto di vista dell'utente", cioè l'attenzione sarà focalizzata sul suo utilizzo, più che sulla descrizione del suo contenuto.

 


 

Header files

 

Le classi e le funzioni della Libreria Standard sono raggruppate in una cinquantina di header files, i cui nomi seguono una particolare convenzione: non hanno estensione (cioè non hanno .h). Per esempio, il principale header file per le operazioni di input-output è <iostream> (al posto di <iostream.h> della "vecchia" libreria).

In ogni header file si trova di solito una classe (con le eventuali classi derivate se è presente una gerarchia di classi), e varie funzioni esterne di appoggio, soprattutto per la definizione di operatori in overload.

A volte un header file include altri header files. Tuttavia, all'inizio di ognuno di essi, sono inserite alcune direttive al preprocessore che, interrogando opportune costanti predefinite, controllano l'effettiva inclusione del file (cioè non lo includono se è già stato incluso precedentemente). Questo permette all'utente di inserire tutte le direttive #include che ritiene necessarie, senza preoccuparsi di generare eventuali duplicazioni di nomi.

La Libreria Standard del C++ ingloba la Run Time Library del C, i cui header files possono essere specificati in due modi:

 


 

Il namespace std

 

Tutta la Libreria Standard del C++ è definita in un unico namespace, che si chiama: std.

Pertanto i nomi delle classi, delle funzioni e degli oggetti definiti nella Libreria devono essere qualificati con il prefisso std::. Per esempio, le operazioni di ouput sul dispostitivo standard vanno scritte:

std::cout << .....     invece di :           cout << .....

Va precisato, tuttavia, che alcuni compilatori più "vecchi" non accettano la qualificazione, e altri, "intermedi", accettano entrambe le forme.

Un'alternativa, anche se sconsigliabile per motivi già detti più volte, è quella di trasferire l'intera Libreria nel namespace globale, mediante la using directive:

using  namespace  std;

la quale rende disponibili tutti i nomi della Libreria senza bisogno di qualificarli.

Per semplicità, visto che i nostri programmi di esempio sono in genere molto brevi, e quindi il pericolo di conflitto fra i nomi è praticamente inesistente, adotteremo questa soluzione.

 


 

La Standard Template Library

 

Un'importante sottinsieme della Libreria Standard del C++ è la cosidetta Standard Template Library (STL), che mette a disposizione degli utenti classi e funzioni template per la gestione dei contenitori e degli associati iteratori e algoritmi.

La principale caratteristica della STL è quella di fornire la massima genericità: i template della STL permettono all'utente di generare la specializzazione che desidera (fatte salve certe premesse), cioè di utilizzare la libreria con dati di qualunque tipo.

Fuori dalla STL, si ritrovano ancora classi e funzioni template, ma in generale la scelta delle possibili specializzazioni si esaurisce in ambiti più ristretti. Per esempio, i template che gestiscono le stringhe e l'input-output limitano la loro genericità alla scelta della codifica dei caratteri utilizzati. Noi abbiamo sempre trattato (e tratteremo) soltanto di caratteri ASCII di un byte (il tipo char), ma è bene sapere che sono possibili anche caratteri con codifiche diverse (per esempio caratteri giapponesi), che occupano più di un byte (i cosidetti wide-characters, o caratteri estesi). Poichè noi "conosciamo" solo il tipo char, quando parleremo di  stringhe e di input-output ignoreremo il fatto che siano template, perchè in realtà tratteremo con template già specializzati con argomento <char>.
Un altro esempio: la classe dei numeri complessi è un template solo per il fatto che i tipi delle parti reale e immaginaria possono essere specializzati con float, double o long double.

Nelle classi e funzioni della STL, invece, la scelta dei tipi degli argomenti è completamente libera: l'unica condizione, per i tipi definiti dall'utente, è che questi siano forniti di tutti gli operatori in overload necessari per eseguire le operazioni previste.

Nel seguito riportiamo, per completezza, l'elenco (in ordine alfabetico) degli header files che fanno capo alla STL. Tratteremo solo di alcuni.

<algorithm>         algoritmi
<deque>         contenitore: coda "bifronte"
<functional>         oggetti-funzione
<iterator>         iteratori
<list>         contenitore: double-linked list
<map>         contenitore: array associativo
<memory>         allocazione di memoria per contenitori
<numeric>         operazioni numeriche
<queue>         contenitore: coda (FIFO)
<set>         contenitore: insieme
<stack>         contenitore: pila (LIFO)
<utility>         coppie di dati e operatori relazionali
<vector>         contenitore: array monodimensionale

 


 

Torna all'Indice