==STL==
la '''Standard Template Library (STL)''' è una [[Libreria software]] inclusa nella Standard Library del linguaggio [[C plus plus|C++]] e definisce [[Strutture dati generiche]], [[Iteratore|Iteratori]] e [[Algoritmi generici]].
==Descrizione==
La STL costituisce uno strato software ormai divenuto fondamentale per i programmatori [[C plus plus|C++]], cui fornisce un set precostituito di classi comuni, come containers e array associativi, che hanno la caratteristica di poter operare con qualsiasi tipo di dato, sia primitivo che definito dall'utente, richiedendo allo sviluppatore solo pochi vincoli nel [[:en:design by contract|contratto]] contratto (ad esempio, l'implementazione di operatori o funzioni di assegnamento o confronto) con il supporto ad alcuneoffrendogli operazioni elementari come copia ed assegnamento.
Caratteristica fondamentale delLa STL è il massiccio utilizzo dei [[Programmazione generica|template]]s. In pratica lo standard ([[ISO/IEC 14882]]) non richiede alle software houses che sviluppano i [[Compilatori|compilatori]], a differenza delle librerie standard del C e del C++, di generare una libreria con codice oggetto cui linkare i programmi che la utilizzano, ma segue un'altra via: le classi e le funzioni non sono dei "prodotti finiti", ma poco più che degli schemi; al momento dell'istanziamento di un oggetto o funzione template, tramite una sintassi particolare, possono essere specificati dei parametri (ad esempio, il tipo che deve essere contenuto in una struttura dati, o la funzione utilizzata per allocare memoria, etc.) utilizzati di volta in volta dal compilatore per generare in linea il codice finale per quell'oggetto, che quindi verrà in un secondo momento convertito in codice oggetto (binario).
Questo tipo di approccio è molto potente e genera codice più efficiente di quello ottenuto attraverso il meccanismo dell'ereditarietà; lo svantaggio è nella generazione del codice, che può risultare molto complesso, tanto da creare talvolta problemi ai compilatori, ai quali può succedere di fallire la compilazione di costrutti validi, di produrre codice non valido, o richiedere al programmatore sforzi ulteriori (non richiesti, in teoria, dallo standard) per ottenere il risultato voluto.
La Standard Template Library è stata la prima libreria a contenere algoritmi e strutture dati generici, seguendo quattro concetti base: programmazione generica, astrattezza senza perdita di efficienza, il [[Architettura di von Neumann|modello computazionale di Von Neumann]], and value semantics.
==Contenuti==
===Containers===
La STL contiene containers sequenziali e associativi. Tra i containers sequenziali troviamo: ''vector'', ''string'' e ''deque''. I [[associative array|containers associativi]] standard sono ''set'', ''multiset'', ''map'' e ''multimap''.
'''vector''' - è un tipo di [[array]] C-like (cioè consente l'accesso casuale) la capacità di ridimensionarsi automaticamente all'atto dell'inserimento o della cancellazione di un oggetto. Inserting and removing an element to/from back of the vector at the end takes constant time. Inserting and erasing at the beginning or in the middle is linear in time.
'''deque''' (''double ended [[queue]]'') - a vector with insertion/erase at the beginning in amortized constant time, however lacking some guarantees on iterator validity after altering the deque.
'''set''' - inserting/erasing elements in a set does not invalidate iterators pointing in the set. Provides set operations [[union (set theory) | union]], [[intersection (set theory) | intersection]], difference, [[symmetric difference]] and test of inclusion.
Libraries implementing STL often include [[hash table | hashed]] variants: ''hash_set'', ''hash_multiset'', ''hash_map'' and ''hash_multimap'', however this extension is not part of standard and are defined in various [[namespace]]s among implementations as a result.
===Iterators===
The STL implements five different types of iterators. These are ''input iterators'', ''output iterators'', ''forward iterators'', ''bidirectional iterators'' and ''random access iterators''.
===Functors===
The STL includes classes that overload the function operator (operator()). Classes that do this are called functor classes or [[function object|function classes]]. They are useful for keeping and retrieving state information in functions passed into other functions.
==Storia==
L'architettura della STL è stata creata in buona parte da [[Alexander Stepanov]]. Nel [[1979]] cominciò ad implementare le sue idee iniziali sulla [[Programmazione generica]], esplorando le sue potenzialità, rivoluzionarie nel campo dello sviluppo del software. Anche se [[Dave Musser]] aveva già sviluppato precedentemente alcuni aspetti della programmazione generica nel [[1971]], i suoi contributi furnono limitati ad una area molto specializzata dello sviluppo software, la (computer [[algebra]]).
Stepanov riconobbe il pieno potenziale della programmazione generica e persuase i suoi allora colleghi della [[General Electric|General Electric Research and Development]] (tra i quali, principalmente, [[Dave Musser]] e [[Deepak Kapur]]) che la programmazione generica should be pursued as a comprehensive basis for software development. A quei tempi non esisteva un supporto reale alla programmazione generica in nessun linguaggio di programmazione.
Il primo linguaggio di una certa importanza a dare tale supporto fu il [[Linguaggio di programmazione Ada]], con le sue generic units. Dal [[1987]] Stepanov e Musser svilupparono e distribuirono una libreria Ada per il processamento di liste che racchiudeva i risultati di buona parte delle loro ricerche sulla programmazione generica. Comunque, l'Ada non ha mai avuto molta diffusione al di fuoari dell'[[industria della difesa]] e il C++ sembrava avere migliori possibilità di diffusione e di provvedere un buon supporto alla programmazione generica anche se il linguaggio era ancora relativamente immaturo (ancora non supportava i templates, aggiunti solo in un secondo momento). Un'altra ragione che ha spinto verso l'utilizzo del C++, che Stepanov riconobbe quasi subito, fu il modello computazionale del C/C++ che consente un accesso molto flessibile alla memorizzazione attraverso i puntatori, cruciale per ottenere genericità senza perdere in efficienza.
Furono necessarie molte ricerche e sperimentazioni, non solo per sviluppare i singoli componenti, ma per sviluppare un'architettura completa per una libreria di componenti basata sulla programmazione generica. Prima ai [[Bell Laboratories|AT&T Bell Laboratories]] e in seguito alla [[Hewlett-Packard|Hewlett-Packard Research Labs]], Stepanov sperimentò molte furmulazioni architettulare e algoritmiche, prima in [[Linguaggio di programmazione C|C]] e in seguito in C++. Musser collaborò a questa ricerca e nel [[1992]] [[Meng Lee]] entrò a far parte del progetto di Stepanov alla HP e ne divenne uno dei principali contributor.
This work undoubtedly would have continued for some time as just a research project or at best would have resulted in an HP proprietary library if [[Andrew Koenig]] of Bell Labs had not become aware of the work and asked Stepanov to present the main ideas at a November [[1993]] meeting of the [[ANSI/ISO committee]] for C++ standardization. The committee's response was overwhelmingly favorable and led to a request from Koenig for a formal proposal in time for the March [[1994]] meeting. Despite the tremendous time pressure, Alex and Meng were able to produce a draft proposal that received preliminary approval at that meeting.
The committee had several requests for changes and extensions (some of them major), and a small group of committee members met with Stepanov and Lee to help work out the details. The requirements for the most significant extension (associative containers) had to be shown to be consistent by fully implementing them, a task Stepanov delegated to Musser. It would have been quite easy for the whole enterprise to spin out of control at this point, but again Stepanov and Lee met the challenge and produced a proposal that received final approval at the July 1994 ANSI/ISO committee meeting. (Additional details of this history can be found in an interview [[Alexander Stepanov]] gave in the March [[1995]] issue of [[Dr. Dobb's Journal]].)
Subsequently, the Stepanov and Lee document 17 was incorporated into the ANSI/ISO C++ draft standard (1, parts of clauses 17 through 27). It also influenced other parts of the C++ Standard Library, such as the string facilities, and some of the previously adopted standards in those areas were revised accordingly.
In spite of STL's success with the committee, there remained the question of how STL would make its way into actual availability and use. With the STL requirements part of the publicly available draft standard, compiler vendors and independent software library vendors could have course develop their own implementations and market them as separate products or as selling points for their other wares. One of the first edition's authors, [[Atul Saini]], was among the first to recognize the commercial potential and began exploring it as a line of business for his company, [[Modena Software Incorporated]], even before STL had been fully accepted by the committee.
The prospects for early widespread dissemination of STL were considerably improved with Hewlett-Packard's decision to make its implementation freely available on the [[Internet]] in August 1994. This implementation, developed by Stepanov, Lee, and Musser during the standardization process, became the basis of all implementations offered by compiler and library vendors today.
==References==
* [[Scott Meyers]], ''[[Effective STL|Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library]]'' ISBN 0201749629
==External links==
*[http://dmoz.org/Computers/Programming/Languages/C%2b%2b/Class_Libraries/STL/ Collection of Links for the STL]
*[http://www.sgi.com/tech/stl/stl_introduction.html SGI Introduction to the STL]
[[Category:C programming language family]]
[[de:Standard_Template_Library]]
[[et:CPP-STL]]
[[fr:Standard Template Library]]
[[pl:Standard Template Library]]
[[zh:标准模板库]]
|