Qual è la differenza tra “STL” e “C ++ Standard Library”?


446

Qualcuno ha portato questo articolo alla mia attenzione secondo cui (sto parafrasando) il termine STL viene utilizzato in modo improprio per fare riferimento all'intera libreria standard C ++ anziché alle parti che sono state prese da SGI STL.

(...) si riferisce alla "STL", nonostante il fatto che pochissime persone usano ancora la STL (che è stata progettata in SGI).

Parti della libreria standard C ++ si basavano su parti dell'STL, ed è in queste parti che molte persone (inclusi diversi autori e il noto cplusplus.com) sono ancora definite "l'STL". Tuttavia, questo è inaccurato; infatti, lo standard C ++ non menziona mai "STL" e ci sono differenze di contenuto tra i due.

(...) "STL" è usato raramente per fare riferimento ai bit dello stdlib che si basano sul SL STL. La gente pensa che sia l'intera libreria standard. Viene messo su CV. Ed è fuorviante.

Non so quasi nulla della storia di C ++, quindi non posso giudicare la correttezza dell'articolo. Devo astenermi dall'usare il termine STL? O è un'opinione isolata?


62
Le persone hanno bisogno di buoni nomi per descrivere le cose. Il genio di Stepanov ha cambiato il modo di programmare. Un nome come "programmazione di librerie standard" è assolutamente inutile per descriverlo. Chiamalo "programmazione stl" e tutti sanno cosa intendi. Discutere su questo non ha senso: abbiamo bisogno di un buon nome.
Hans Passant,

34
@Hans: No, ti manca il punto: " tutti sanno cosa intendi" non è vero .
Razze di leggerezza in orbita

16
Non ho idea di cosa intendi.
Hans Passant,

21
Ecco un esempio perfetto di qualcuno che sta usando "STL" per fare riferimento all'intera libreria standard C ++. Continua a sconcertarmi che così tante persone giurano cieche che nessuno lo fa mai, quando è chiaro vederlo quasi quotidianamente.
Razze di leggerezza in orbita

Risposte:


571

"STL" è stato scritto da Alexander Stepanov nei giorni molto precedenti alla standardizzazione del C ++. Il C ++ esisteva negli anni '80, ma quello che ora chiamiamo " C ++ " è il linguaggio standardizzato in ISO / IEC 14882: 2014 (e versioni precedenti, come ISO / IEC 14882: 2011).

L'STL era già ampiamente utilizzato come libreria per C ++, offrendo ai programmatori l'accesso a contenitori, iteratori e algoritmi. Quando è avvenuta la standardizzazione, il comitato linguistico ha progettato parti della libreria standard C ++ (che fa parte dello standard linguistico) per molto da corrispondere attentamente alla STL.

Nel corso degli anni, molte persone - inclusi autori di libri di spicco e vari siti Web - hanno continuato a riferirsi alla libreria standard C ++ come "la STL", nonostante il fatto che le due entità siano separate e che ci siano alcune differenze. Queste differenze sono ancora più pronunciate nel nuovo standard C ++ in arrivo, che include varie funzionalità e altera in modo significativo alcune classi.

L'STL originale ora viene spesso chiamato "un'implementazione della libreria di modelli standard C ++" (piuttosto indietro rispetto alla cronologia attuale!), Allo stesso modo in cui Microsoft Visual Studio o GCC distribuiscono un'implementazione della libreria standard C ++. Ma "Standard Template Library" e "Standard Library" non sono la stessa cosa.

La battaglia riguarda se l'attuale libreria standard dovrebbe essere chiamata "la STL" in tutto o in parte e / o se è importante come si chiama.

Per "STL"

C'è una scuola di pensiero che dice che ora tutti sanno che "STL" significa la libreria standard, proprio come tutti ora sanno che "C ++" è il linguaggio standardizzato ISO.

Comprende anche coloro che credono che non abbia davvero importanza finché tutte le parti capiscono di cosa si sta parlando.

È un termine reso ancora più diffuso dalla natura della bestia, molti dei quali fanno un uso pesante della funzione C ++ nota come "template".

Per "C ++ Standard Library" (o stdlib)

Tuttavia, c'è un'altra scuola di pensiero - a cui mi iscrivo - che dice che questo è confuso. Le persone che imparano il C ++ per la prima volta non lo fanno conoscono questa distinzione e potrebbero non notare piccole differenze linguistiche.

L'autore di questo articolo ha incontrato numerose volte persone che credevano che l'intera libreria standard C ++ fosse la STL, incluse funzionalità che non facevano mai parte della stessa STL. La maggior parte dei fautori vocali di "the STL", al contrario, sanno esattamente cosa significano con esso e si rifiutano di credere che non tutti "capiscono". Chiaramente, l'uso del termine non è uniforme.

Inoltre, ci sono alcune librerie simili a STL che sono in realtà implementazioni dell'STL originale, non della libreria standard C ++. Fino a poco tempo fa, STLPort era uno di questi (e anche lì, la confusione abbonda!).

Inoltre, lo standard C ++ non contiene il testo "STL" da nessuna parte, e alcune persone usano abitualmente frasi come "lo STL è incluso nella libreria standard C ++", il che è chiaramente errato.

Sono convinto che continuare a propagare l'uso del termine in questo modo porterà solo a un malinteso che dura per sempre. Purtroppo, può essere del tutto controproducente tentare di cambiare le cose, anche se dovrebbe essere in meglio. Potremmo rimanere bloccati per sempre con doppi significati.

Conclusione

Apprezzo che questo post sia stato un po 'distorto: ho scritto l'articolo a cui hai collegato. :) Spero comunque che questo aiuti a spiegare meglio la battaglia.

Aggiornamento 13/04/2011

Ecco tre esempi perfetti di qualcuno che sta usando "STL" per fare riferimento all'intera libreria standard C ++. Continua a sconcertarmi che così tante persone giurano cieche che nessuno lo fa mai, quando è chiaro vederlo quasi quotidianamente.


136
L' S tandard T Emplate L ibrary non solo è stato creato da St epanov e L EE, ma sono state anche lavorando al S oftware T ecnologia L aboratory al momento.
Kragen Javier Sitaker,

21
Qualcuno oggi ha chiesto in che intestazione si std::iotatrova, perché non è riuscito a farlo funzionare. È un'estensione SGI non standard , che chiamano "standard" quando li soddisfa perché è "la STL", e tutti sanno che "la STL" fa parte della libreria standard C ++, giusto? Ed è stato introdotto in C ++ 0x, ma non è disponibile in C ++ 03. Grrr.
Razze di leggerezza in orbita

40
E MS STL è mantenuto da S tephan T . L avavej, alias STL.
Mihaela,


26
Bjarne Stroustrup differenzia in modo specifico l'STL dalle altre parti della Standard Library nel "canone", The C ++ Programming Language 4th Edition.
codenheim,

84

Non esiste una risposta che sia davvero corretta. Alexander Stepanov ha sviluppato una biblioteca che ha chiamato STL (all'epoca lavorava per HP). Quella libreria fu quindi proposta per l'inclusione nello standard C ++.

Questo sviluppo sostanzialmente "biforcuto". Il comitato includeva alcune parti, ne respingeva completamente altre e ne riprogettò alcune (con la partecipazione di Alessandro). Lo sviluppo della libreria originale è stato successivamente spostato in Silicon Graphics, ma è proseguito separatamente dalla libreria standard C ++.

Dopo questi pezzi sono stati aggiunti alla libreria standard, alcune altre parti della libreria standard sono state modificate per adattarsi meglio con quanto aggiunto (ad esempio, begin, end, rbegine rendsono stati aggiunti std::stringin modo che possa essere utilizzato come un contenitore). Più o meno nello stesso periodo, la maggior parte della libreria (anche pezzi completamente indipendenti) sono stati trasformati in modelli per adattarsi a tipi diversi (ad esempio, flussi standard).

Alcune persone usano anche STL come una breve forma di "Libreria standard".

Ciò significa che quando qualcuno usa il termine "STL" potrebbero riferirsi a circa una mezza dozzina di cose diverse. Nel bene e nel male, la maggior parte delle persone che lo usano sembrano ignorare la molteplicità dei significati e presumere che tutti gli altri riconosceranno ciò a cui si riferiscono. Questo porta a molti fraintendimenti, e almeno alcune guerre di fiamma gravi che hanno reso la maggior parte dei partecipanti sciocca perché stavano semplicemente parlando di cose completamente diverse.

Sfortunatamente, è probabile che la confusione continui senza sosta. È molto più comodo fare riferimento a "STL" piuttosto che qualcosa come "i contenitori, gli iteratori e gli algoritmi nella libreria standard C ++, ma non includere std::string, anche se può agire come un contenitore". Anche se la "libreria standard C ++" non è così lunga e goffa, "STL" è ancora molto più breve e semplice. Fino a quando qualcuno non inventa termini più precisi (quando necessario) e altrettanto convenienti, "STL" continuerà a essere utilizzato e continuerà a creare confusione.


5
@Jerry: il primo; ecco cosa significa "std". :)
Corse di leggerezza in orbita

6
@Jerry: non sono sicuro di dove vengano gli spazi dei nomi. Le implementazioni conformi non aggiungono nulla allo spazio dei nomi std. Stavo parlando dello "std" in "stdlib", che sta per "standard". Penso che sia abbastanza chiaro cosa significhi!
Corse di leggerezza in orbita

3
@Jerry: non credo davvero che ci si aspetti che qualcuno legga l'aggettivo "standard" in quanto "questo è nello standard". Nel frattempo, 17.4.3.1/1 è abbastanza chiaro che l'aggiunta di cose allo spazio dei nomi stdè UB, tranne in alcuni casi specifici: questi casi di addizione sono nominati nello standard e quindi sono ancora perfettamente conformi; "standard" verrebbe comunque applicato.
Corse di leggerezza in orbita

1
La storia di SGI e HP qui è al contrario. Stepanov era in HP prima di essere in SGI.
Kragen Javier Sitaker,

2
Ho appena riletto i commenti qui e ho pensato che valesse la pena aggiungere un altro punto (certamente minore): penso che sia un po 'eccessivo aspettarsi che "standard" significhi sempre "questo è nello standard". In particolare, molti programmatori C ++ hanno usato la frase "libreria standard" molto prima che ci fosse uno standard. Per non pensare che si riferissero alla libreria nello standard C, farò notare che lo stesso valeva per i programmatori C ben prima che esistesse (anche una bozza) uno standard C.
Jerry Coffin,

52

Il termine "STL" o "Libreria di modelli standard" non compare da nessuna parte nello standard ISO 14882 C ++. Quindi fare riferimento alla libreria standard C ++ come STL è sbagliato. Il termine "Libreria standard C ++" o "libreria standard" è ciò che è ufficialmente utilizzato da ISO 14882:

Standard ISO 14882 C ++:

17 - Introduzione alla libreria [lib.library]:

  1. Queste clausole descrivono il contenuto della libreria standard C ++ , in che modo un programma C ++ ben formato utilizza la libreria e in che modo un'implementazione conforme può fornire le entità nella libreria.

...

STL è una libreria originariamente progettata da Alexander Stepanov, indipendente dallo standard C ++. Tuttavia, alcuni componenti della libreria standard C ++ includono componenti STL come vector, liste algoritmi come copye swap.

Ma ovviamente lo standard C ++ include molte più cose al di fuori dell'STL, quindi il termine "libreria standard C ++" è più corretto (ed è ciò che viene effettivamente utilizzato dai documenti standard).


5
+1. Sebbene, nell'STL, non esistesse uno stdspazio dei nomi (IIRC).
Razze di leggerezza in orbita

1
All'epoca, la maggior parte dei compilatori C ++ non implementava spazi dei nomi. In realtà, non so se fossero addirittura nello standard.
Kragen Javier Sitaker,

3
@Kragen: Beh, non c'erano standard.
Razze di leggerezza in orbita

3
Oh. Bene, c'erano alcuni libri di Stroustrup, ma suppongo che non sia esattamente la stessa cosa, vero?
Kragen Javier Sitaker

23

Di recente ho fatto lo stesso argomento, ma credo che una piccola tolleranza possa essere consentita. Se Scott Meyers commette lo stesso errore, sei in buona compagnia.


@Tomalak & @Mark: in realtà Scott no, -1da parte mia. Il libro parla in effetti dell'STL nel significato di "le parti della libreria standard derivate dalla biblioteca di Stepanov". Prenditi il ​​tempo di consultare i libri TOC. L'unica cosa al di fuori della STL originale che riuscivo a trovare era std::string, ed era stato equipaggiato per essere un contenitore STL in piena regola.
sabato

@sbi: Hai evidentemente frainteso la mia posizione. Non userei "STL" come fa Scott. Per favore leggi la mia risposta.
Razze di leggerezza in orbita

6
@Tomalak, non userei neanche "STL" in quel modo, anche se probabilmente mi sono reso colpevole in passato. Non penso che valga la pena picchiare le persone.
Mark Ransom

1
Che posso rispettare. Mi arrabbio molto per le persone che si rifiutano di riconoscere la potenziale ambiguità. :)
Razze di leggerezza in orbita

11
Saresti anche in compagnia di Bjarne Stroustrup - rif. per esempio. stroustrup.com/DnE2005.pdf : "la STL (la" Libreria di modelli standard "; ovvero i contenitori e la struttura degli algoritmi della libreria standard ISO C ++)"
Sander De Dycker,

7

Dalla FAQ GNU Standard C ++ Library (libstdc ++) :


La STL (Standard Template Library) è stata l'ispirazione per grossi pezzi della libreria standard C ++, ma i termini non sono intercambiabili e non significano la stessa cosa. La libreria standard C ++ include molte cose che non provengono dall'STL e alcune di esse non sono nemmeno modelli, come std::localeestd::thread .

Libstdc ++ - v3 incorpora molto codice dallo SGI STL (la fusione finale era dalla versione 3.3 ). Il codice in libstdc ++ contiene molte correzioni e modifiche rispetto al codice SGI originale.

In particolare, stringnon proviene da SGI e non fa uso della loro classe "corda" (sebbene sia inclusa come estensione opzionale), né lo è valarrayné alcuni altri. Classi comevector<> erano di SGI, ma sono state ampiamente modificate.

Maggiori informazioni sull'evoluzione di libstdc ++ sono disponibili sull'evoluzione dell'API e sulla retrocompatibilità documentazione relativa .

Le FAQ per STL di SGI sono ancora consigliate da leggere.


Cordiali saluti, a partire da marzo 2018 anche il sito web ufficiale STL www.sgi.com/tech/stl/ è scomparso .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.