Was ist der Unterschied zwischen "STL" und "C ++ Standard Library"?


446

Jemand machte mich auf diesen Artikel aufmerksam, der behauptet (ich paraphrasiere), dass der STL-Begriff missbraucht wird, um auf die gesamte C ++ - Standardbibliothek anstatt auf die Teile zu verweisen, die aus SGI STL stammen.

(...) es bezieht sich auf die "STL", obwohl nur noch sehr wenige Menschen die STL verwenden (die bei SGI entwickelt wurde).

Teile der C ++ - Standardbibliothek basierten auf Teilen der STL, und diese Teile werden von vielen Personen (einschließlich mehrerer Autoren und der notorisch fehlerbehafteten cplusplus.com) immer noch als "STL" bezeichnet. Dies ist jedoch ungenau; In der Tat erwähnt der C ++ - Standard niemals "STL", und es gibt inhaltliche Unterschiede zwischen den beiden.

(...) "STL" wird selten verwendet, um auf die Bits der stdlib zu verweisen, die zufällig auf der SGI STL basieren. Die Leute denken, es ist die gesamte Standardbibliothek. Es wird in Lebensläufe aufgenommen. Und es ist irreführend.

Ich weiß kaum etwas über die Geschichte von C ++, daher kann ich die Richtigkeit des Artikels nicht beurteilen. Sollte ich den Begriff STL nicht verwenden? Oder ist das eine isolierte Meinung?


62
Menschen brauchen gute Namen, um Dinge zu beschreiben. Stepanovs Genie hat unsere Programmierung verändert. Ein Name wie "Standardbibliotheksprogrammierung" ist völlig nutzlos, um das zu beschreiben. Nennen Sie es "STL-Programmierung" und jeder weiß, was Sie meinen. Darüber zu streiten, geht einfach daneben: Wir brauchen einen guten Namen.
Hans Passant

34
@Hans: Nein, du verpasst den Punkt: " Jeder weiß was du meinst" ist nicht wahr .
Leichtigkeitsrennen im Orbit

16
Ich habe keine Ahnung was du meinst.
Hans Passant

21
Hier ist ein perfektes Beispiel für jemanden, der "die STL" verwendet, um auf die gesamte C ++ - Standardbibliothek zu verweisen. Es verwirrt mich weiterhin, dass so viele Menschen blind schwören, dass niemand dies jemals tut, wenn es fast täglich zu sehen ist.
Leichtigkeitsrennen im Orbit

Antworten:


571

Die "STL" wurde von Alexander Stepanov in den Tagen lange vor der Standardisierung von C ++ geschrieben. C ++ existierte in den 80ern, aber was wir jetzt " C ++ " nennen " nennen, ist die in ISO / IEC 14882: 2014 (und früheren Versionen wie ISO / IEC 14882: 2011) standardisierte Sprache.

Die STL wurde bereits häufig als Bibliothek für C ++ verwendet, um Programmierern Zugriff auf Container, Iteratoren und Algorithmen zu gewähren. Als die Standardisierung erfolgte, entwarf das Sprachkomitee Teile der C ++ - Standardbibliothek (die Teil des Sprachstandards ist) so, dass sie sehr genau mit der STL übereinstimmen.

Im Laufe der Jahre haben viele Menschen - darunter prominente Buchautoren und verschiedene Websites - die C ++ - Standardbibliothek weiterhin als "STL" bezeichnet, obwohl die beiden Entitäten getrennt sind und es einige Unterschiede gibt. Diese Unterschiede sind im kommenden neuen C ++ - Standard noch ausgeprägter, der verschiedene Funktionen enthält und einige Klassen erheblich verändert.

Die ursprüngliche STL wird heute häufig als "Implementierung der C ++ - Standardvorlagenbibliothek" bezeichnet (eher rückwärts zum tatsächlichen Verlauf!), So wie Microsoft Visual Studio oder GCC eine Implementierung der C ++ - Standardbibliothek ausliefert. Die "Standard Template Library" und die "Standard Library" sind jedoch nicht dasselbe.

Im Kampf geht es darum, ob die aktuelle Standardbibliothek ganz oder teilweise als "STL" bezeichnet werden soll und / oder ob es darauf ankommt, wie sie heißt.

Für "STL"

Es gibt eine Denkschule, die besagt, dass jeder jetzt weiß, dass "STL" die Standardbibliothek bedeutet, genauso wie jeder jetzt weiß, dass "C ++" die ISO-standardisierte Sprache ist.

Es schließt auch diejenigen ein, die glauben, dass es nicht wirklich wichtig ist , solange alle Parteien verstehen, worüber gesprochen wird.

Es ist ein Begriff, der durch die Natur des Tieres noch häufiger verwendet wird. In vielen Fällen wird die als "Vorlagen" bekannte C ++ - Funktion stark genutzt.

Für "C ++ Standard Library" (oder stdlib)

Es gibt jedoch eine andere Denkrichtung - der ich mich anschließe -, die besagt, dass dies verwirrend ist. Leute, die zum ersten Mal C ++ lernen nicht kennen diese Unterscheidung und nicht kleine sprachliche Unterschiede feststellen.

Der Autor dieses Artikels ist mehrfach auf Leute gestoßen, die glauben, dass die gesamte C ++ - Standardbibliothek vorhanden ist die STL, einschließlich Funktionen , die nie Teil der STL selbst waren. Im Gegensatz dazu wissen die meisten Befürworter der "STL" genau, was sie damit meinen, und weigern sich zu glauben, dass nicht jeder "es versteht". Die Verwendung des Begriffs ist eindeutig nicht einheitlich.

Darüber hinaus gibt es einige STL-ähnliche Bibliotheken, bei denen es sich tatsächlich um Implementierungen der ursprünglichen STL handelt, nicht der C ++ - Standardbibliothek. Bis vor kurzem war STLPort einer von ihnen (und selbst dort die Verwirrung !).

Des Weiteren wird der C ++ Standard - nicht den Text „STL“ enthalten überall, und einige Leute gewöhnlich Sätze beschäftigen wie „die STL ist enthalten in der C ++ Standard Library“, die schlicht falsch ist.

Ich bin der Überzeugung, dass die weitere Verbreitung der Verwendung des Begriffs auf diese Weise nur zu einem Missverständnis führen wird, das für immer andauert. Leider kann es völlig kontraproduktiv sein, zu versuchen, Dinge zu ändern, selbst wenn es zum Besseren sein soll. Wir können nur für immer mit Doppelbedeutungen stecken bleiben.

Fazit

Ich schätze, dass dieser Beitrag etwas voreingenommen war: Ich habe den Artikel geschrieben, auf den Sie verlinkt haben. :) Wie auch immer, ich hoffe das hilft, den Kampf ein bisschen besser zu erklären.

Update 13/04/2011

Hier sind drei perfekte Beispiele für jemanden, der "die STL" verwendet, um auf die gesamte C ++ - Standardbibliothek zu verweisen. Es verwirrt mich weiterhin, dass so viele Menschen blind schwören, dass niemand dies jemals tut, wenn es fast täglich zu sehen ist.


136
Die S tandard T emplate L ibrary wurde nicht nur erstellt von St epanov und L ee, aber sie arbeiten auch an dem S oftware T echnology L abor zu der Zeit.
Kragen Javier Sitaker

21
Hatte heute jemand gefragt, in welchem ​​Header sich std::iotabefindet, weil er es nicht zum Laufen bringen konnte. Es ist eine nicht standardmäßige SGI-Erweiterung , die sie "Standard" nennen, wenn es ihnen passt, weil es "die STL" ist, und jeder weiß, dass "die STL" Teil der C ++ - Standardbibliothek ist, oder? Und es wurde in C ++ 0x eingeführt, ist aber in C ++ 03 nicht verfügbar. Grrr.
Leichtigkeitsrennen im Orbit

40
Und MS STL wird von S tephan T verwaltet . L avavej, auch bekannt als STL.
Mihaela


26
Bjarne Stroustrup unterscheidet die STL im "Canon", The C ++ Programming Language 4th Edition, speziell von anderen Teilen der Standard Library.
Codenheim

84

Es gibt keine Antwort, die wirklich richtig ist. Alexander Stepanov entwickelte eine Bibliothek namens STL (damals für HP tätig). Diese Bibliothek wurde dann zur Aufnahme in den C ++ - Standard vorgeschlagen.

Diese "gespaltene" Entwicklung im Grunde. Das Komitee umfasste einige Teile, lehnte andere vollständig ab und gestaltete einige neu (unter Beteiligung von Alexander). Die Entwicklung der ursprünglichen Bibliothek wurde später auf Silicon Graphics verschoben, jedoch getrennt von der C ++ - Standardbibliothek fortgesetzt.

Nachdem diese Stücke auf der Standard - Bibliothek hinzugefügt wurden, wurden einige andere Teile der Standardbibliothek zu passen besser modifiziert mit dem, was hinzugefügt wurde ( zum Beispiel begin, end, rbeginund rendwurden hinzugefügt , std::stringso dass es wie ein Behälter verwendet werden könnte). Etwa zur gleichen Zeit war der größte Teil der Bibliothek (sogar Stücke, die komplett waren ohne Bezug) wurden in Vorlagen aus verschiedenen Typen aufnehmen (zB Standard - Streams).

Einige Leute verwenden STL auch nur als Kurzform der "STandard Library".

Das heißt, wenn jemand den Begriff "STL" verwendet, kann er sich auf eines von etwa einem halben Dutzend verschiedener Dinge beziehen. Ob gut oder schlecht, die meisten Leute, die es benutzen, scheinen die Vielzahl der Bedeutungen zu ignorieren und davon auszugehen, dass alle anderen erkennen, worauf sie sich beziehen. Dies führt zu vielen Missverständnissen und zumindest einigen ernsthaften Flammenkriegen, die die meisten Teilnehmer dumm aussehen ließen, weil sie einfach über ganz andere Dinge sprachen.

Leider wird die Verwirrung wahrscheinlich unvermindert anhalten. Es ist viel bequemer, auf "STL" zu verweisen als auf "die Container, Iteratoren und Algorithmen in der C ++ - Standardbibliothek, jedoch nicht auf diese std::string, obwohl sie sich wie ein Container verhalten können". Obwohl "C ++ Standard Library" nicht ganz so lang und ungeschickt ist, ist "STL" immer noch viel kürzer und einfacher. Bis oder solange jemand Begriffe erfindet, die präziser (wenn nötig) und genauso praktisch sind, wird "STL" weiterhin verwendet und es kommt weiterhin zu Verwirrung.


5
@ Jerry: Ersteres; dafür steht "std". :)
Leichtigkeitsrennen im Orbit

6
@ Jerry: Ich bin mir nicht sicher, wo Namespaces hineinkommen. Konforme Implementierungen fügen dem Namespace nichts hinzu std. Ich habe über "std" in "stdlib" gesprochen, was für "standard" steht. Ich denke es ist ziemlich klar was das bedeutet!
Leichtigkeitsrennen im Orbit

3
@ Jerry: Ich glaube wirklich nicht, dass es schwierig ist, von jemandem zu erwarten, dass er das Adjektiv "Standard" als "Dies ist im Standard" liest. In der Zwischenzeit ist 17.4.3.1/1 ziemlich klar, dass das Hinzufügen von Dingen zum Namespace stdUB ist, außer in einigen bestimmten benannten Fällen: Diese Fälle des Hinzufügens sind im Standard benannt und daher immer noch vollkommen konform; "Standard" würde weiterhin gelten.
Leichtigkeitsrennen im Orbit

1
Die Geschichte von SGI und HP ist hier rückwärts. Stepanov war bei HP, bevor er bei SGI war.
Kragen Javier Sitaker

2
Ich habe die Kommentare hier nur noch einmal gelesen und dachte, es lohnt sich, noch einen (zugegebenermaßen geringfügigen) Punkt hinzuzufügen: Ich denke, es ist ein bisschen schwierig zu erwarten, dass "Standard" immer "dies ist im Standard" bedeutet. Insbesondere verwendet viele C ++ Programmierer den Begriff „Standard - Bibliothek“ , lange bevor es war ein Standard. Damit man nicht glaubt, dass sie sich auf die Bibliothek im C-Standard beziehen, möchte ich darauf hinweisen, dass dies auch für C-Programmierer gilt, lange bevor es (sogar einen Entwurf) eines C-Standards gab.
Jerry Coffin

52

Der Begriff "STL" oder "Standard Template Library" kommt im ISO 14882 C ++ - Standard nirgendwo vor. Es ist also falsch, die C ++ - Standardbibliothek als STL zu bezeichnen. Der Begriff "C ++ Standard Library" oder "Standard Library" wird von ISO 14882 offiziell verwendet:

ISO 14882 C ++ Standard:

17 - Bibliothekseinführung [lib.library]:

  1. Diese Klausel beschreibt den Inhalt der C ++ - Standardbibliothek , wie ein wohlgeformtes C ++ - Programm die Bibliothek verwendet und wie eine konforme Implementierung die Entitäten in der Bibliothek bereitstellen kann.

...

STL ist eine Bibliothek, die ursprünglich von Alexander Stepanov unabhängig vom C ++ - Standard entworfen wurde. Allerdings sind einige Komponenten der C ++ Standardbibliothek STL - Komponenten wie vector, listund Algorithmen wie copyundswap .

Aber natürlich enthält der C ++ - Standard viel mehr Dinge außerhalb der STL, daher ist der Begriff "C ++ - Standardbibliothek" korrekter (und wird tatsächlich von den Standarddokumenten verwendet).


5
+1. Obwohl es in der STL keinen stdNamespace (IIRC) gab.
Leichtigkeitsrennen im Orbit

1
Zu diesem Zeitpunkt haben die meisten C ++ - Compiler keine Namespaces implementiert. Tatsächlich weiß ich nicht, ob sie überhaupt im Standard waren.
Kragen Javier Sitaker

3
@Kragen: Nun, es gab keinen Standard.
Leichtigkeitsrennen im Orbit

3
Oh. Nun, es gab einige Bücher von Stroustrup, aber ich nehme an, das ist nicht ganz dasselbe, oder?
Kragen Javier Sitaker

23

Ich habe das gleiche Argument kürzlich vorgebracht, aber ich glaube, dass ein wenig Toleranz erlaubt sein kann. Wenn Scott Meyers den gleichen Fehler macht, sind Sie in guter Gesellschaft.


@Tomalak & @Mark: Eigentlich nicht, -1von mir. Das Buch handelt in der Tat von der STL im Sinne von "den Teilen der Standardbibliothek, die aus Stepanovs Bibliothek stammen". Nehmen Sie sich Zeit, um das Inhaltsverzeichnis der Bücher durchzusehen. Das einzige, was ich außerhalb der ursprünglichen STL finden konnte, war std::string, dass es sich um einen ausgewachsenen STL-Container handelte.
sbi

@sbi: Du hast meine Position offensichtlich falsch interpretiert. Ich würde "STL" nicht so verwenden wie Scott. Bitte lesen Sie meine Antwort.
Leichtigkeitsrennen im Orbit

6
@Tomalak, ich würde "STL" auch nicht auf diese Weise verwenden, obwohl ich mich wahrscheinlich in der Vergangenheit daran schuldig gemacht habe. Ich glaube einfach nicht, dass es sich lohnt, Leute zu verprügeln.
Mark Ransom

1
Das kann ich respektieren. Ich werde am ärgerlichsten über Menschen, die sich weigern, die mögliche Mehrdeutigkeit überhaupt anzuerkennen. :)
Leichtigkeitsrennen im Orbit

11
Sie wären auch in der Gesellschaft von Bjarne Stroustrup - ref. z.B. stroustrup.com/DnE2005.pdf : "Die STL (die" Standardvorlagenbibliothek ", dh das Container- und Algorithmus-Framework der ISO C ++ - Standardbibliothek)"
Sander De Dycker

7

Aus den häufig gestellten Fragen zur GNU Standard C ++ - Bibliothek (libstdc ++) :


Die STL (Standard Template Library) war die Inspiration für große Teile der C ++ Standard Library, aber die Begriffe sind nicht austauschbar und bedeuten nicht dasselbe. Die C ++ - Standardbibliothek enthält viele Dinge, die nicht aus der STL stammen, und einige davon sind nicht einmal Vorlagen wie std::localeund std::thread.

Libstdc ++ - v3 enthält viel Code aus der SGI STL (die endgültige Zusammenführung erfolgte ab Version 3.3 ). Der Code in libstdc ++ enthält viele Korrekturen und Änderungen im Vergleich zum ursprünglichen SGI-Code.

Insbesondere stringist nicht von SGI und nutzt ihre "Seil" -Klasse nicht (obwohl dies als optionale Erweiterung enthalten ist), weder ist valarraynoch einige andere. Klassen wievector<> waren von SGI, wurden aber umfassend modifiziert.

Weitere Informationen zur Entwicklung von libstdc ++ finden Sie unter API-Entwicklung und Abwärtskompatibilität Dokumentation zur .

Die FAQ für die STL von SGI wird weiterhin empfohlen.


Zu Ihrer Information , ab März 2018 ist sogar die offizielle STL-Website www.sgi.com/tech/stl/ weg .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.