web-dev-qa-db-fra.com

Quelle est la différence entre "STL" et "C ++ Standard Library"?

Quelqu'un a signalé cet article à mon attention que prétend (je paraphrase) le terme STL est utilisé à mauvais escient pour faire référence à l'ensemble Bibliothèque standard C++ à la place des pièces extraites de SGI STL.

(...) il fait référence au "STL", malgré le fait que très peu de personnes utilisent encore le STL (conçu par SGI).

Certaines parties de la bibliothèque standard C++ étaient basées sur des parties du STL, et ce sont ces parties que beaucoup de personnes (y compris plusieurs auteurs et cplusplus.com, réputée pour ses erreurs) appellent encore le "STL". Cependant, ceci est inexact. en effet, la norme C++ ne mentionne jamais "STL" et il existe des différences de contenu entre les deux.

(...) "STL" est rarement utilisé pour désigner les bits de la bibliothèque stdlib qui sont basés sur la STL SGI. Les gens pensent que c'est la bibliothèque standard entière. Il est mis sur les CV. Et c'est trompeur.

Je ne connais presque rien de l’histoire de C++, je ne peux donc pas juger de la justesse de cet article. Devrais-je m'abstenir d'utiliser le terme STL? Ou est-ce un avis isolé?

416
Pieter

Le "STL" a été écrit par Alexander Stepanov dans les jours qui ont précédé la standardisation de C++. Le C++ existait jusque dans les années 80, mais ce que nous appelons maintenant " C++ " est le langage normalisé dans l'ISO/CEI 14882: 2014 (et ses versions antérieures, telles que l'ISO/CEI 14882: 2011).

La STL était déjà largement utilisée en tant que bibliothèque pour C++, donnant aux programmeurs un accès aux conteneurs, aux itérateurs et aux algorithmes. Lorsque la normalisation est survenue, le comité des langues a conçu des parties de la bibliothèque standard C++ (qui fait partie du standard de langue) pour très correspondre étroitement à la STL.

Au fil des ans, de nombreuses personnes - y compris des auteurs de livres renommés et divers sites Web - ont continué à appeler la bibliothèque standard C++ "le STL", malgré le fait que les deux entités sont distinctes et qu'il existe certaines différences. Ces différences sont encore plus marquées dans la nouvelle norme C++, qui inclut diverses fonctionnalités et modifie de manière significative certaines classes.

La STL d'origine est maintenant souvent appelée "une implémentation de la bibliothèque de modèles standard C++" (plutôt en arrière de l'historique réel!), De la même manière que Microsoft Visual Studio ou GCC fournit une implémentation de la bibliothèque standard C++. Mais la "bibliothèque de modèles standard" et la "bibliothèque standard" ne sont pas la même chose.

La bataille consiste à savoir si la bibliothèque standard actuelle doit être appelée "la STL" en tout ou en partie et/ou si le nom de la bibliothèque importe.

Pour "STL"

Il y a une école de pensée qui dit que tout le monde sait maintenant que "STL" signifie la bibliothèque standard, tout comme tout le monde sait maintenant que "C++" est le langage normalisé ISO.

Cela inclut également ceux qui croient que cela n'a pas vraiment d'importance tant que toutes les parties comprennent ce dont on parle.

C'est un terme rendu encore plus répandu par la nature de la bête, qui utilise beaucoup la fonctionnalité C++ appelée "modèles".

Pour "Bibliothèque standard C++" (ou stdlib)

Cependant, il existe une autre école de pensée - à laquelle je souscris - qui dit que c'est déroutant. Les personnes qui apprennent le C++ pour la première fois ne connaissent pas cette distinction et risquent de ne pas remarquer de petites différences de langage.

L'auteur de cet article a rencontré à de nombreuses reprises des personnes qui pensent que l'ensemble de la bibliothèque standard C++ est le STL, y compris des fonctionnalités qui ne faisaient jamais partie du STL lui-même. La plupart des défenseurs vocaux du "TSL", au contraire, savent exactement ce qu'ils entendent par là et refusent de croire que tout le monde "ne comprend pas". Clairement, l'utilisation du terme n'est pas uniforme.

En outre, certaines bibliothèques de type STL sont en fait des implémentations du STL d'origine, et non de la bibliothèque standard C++. Jusqu'à récemment, STLPort était l'un d'entre eux (et même là, la confusion abonde!).

De plus, la norme C++ ne contient nulle part le texte "STL", et certaines personnes utilisent habituellement des expressions telles que "la STL est incluse dans la bibliothèque de normes C++", ce qui est tout simplement incorrect. .

Je suis convaincu que continuer à propager l'usage du terme de cette manière ne fera que conduire à un malentendu qui perdure à jamais. Hélas, il peut être totalement contre-productif d'essayer de changer les choses, même si c'est supposé être pour le mieux. Il se peut que nous soyons coincés avec un double sens pour toujours.

Conclusion

J'apprécie que cet article ait été un peu partial: j'ai écrit l'article que vous avez lié. :) Quoi qu'il en soit, j'espère que cela aidera à expliquer un peu mieux la bataille.

Mise à jour du 13/04/2011

Voici troisparfaitexemples de quelqu'un qui utilise "la STL" pour faire référence à l'ensemble de la bibliothèque standard C++. Cela me déconcerte toujours de penser que tant de personnes jurent aveugle que personne ne le fait jamais, alors qu'il est évident de le voir presque tous les jours.

539

Il n'y a pas une seule réponse qui soit vraiment correcte. Alexander Stepanov a développé une bibliothèque qu'il a appelée STL (travaillant pour HP à l'époque). Cette bibliothèque a ensuite été proposée pour inclusion dans la norme C++.

Ce développement essentiellement "forké". Le comité comprenait certaines parties, en rejetait complètement d'autres et en modifiait quelques-unes (avec la participation d'Alexandre). Le développement de la bibliothèque d'origine a ensuite été déplacé vers Silicon Graphics, mais s'est poursuivi séparément de la bibliothèque standard C++.

Une fois ces éléments ajoutés à la bibliothèque standard, certaines autres parties de la bibliothèque standard ont été modifiées pour mieux correspondre à ce qui a été ajouté (par exemple, begin, end, rbegin et rend ont été ajoutés à std::string afin qu’il puisse être utilisé comme un conteneur). A peu près au même moment, la plupart de la bibliothèque (même les morceaux qui étaient complètement non apparentés) ont été transformés en modèles pour s’adapter à différents types (par exemple, les flux standard).

Certaines personnes utilisent également STL comme une forme abrégée de "Bibliothèque standard".

Cela signifie que lorsque quelqu'un utilise le terme "STL", il peut faire référence à une demi-douzaine de choses différentes. Pour le meilleur ou pour le pire, la plupart des gens qui l'utilisent semblent ignorer la multiplicité des significations et supposent que tous les autres reconnaîtront ce à quoi ils font référence. Cela conduit à de nombreux malentendus et à au moins quelques guerres de flammes sérieuses qui ont semblé à la plupart des participants ridicules, car ils parlaient simplement de choses totalement différentes.

Malheureusement, la confusion risque de se poursuivre sans relâche. Il est beaucoup plus pratique de se référer à "STL" qu'à "les conteneurs, les itérateurs et les algorithmes de la bibliothèque standard C++, mais n'incluant pas std::string, même s'il peut se comporter comme un conteneur". Même si "bibliothèque standard C++" n'est pas aussi long et lourd que cela, "STL" est toujours beaucoup plus court et simple. Jusqu'à ce que ou à moins que quelqu'un invente des termes plus précis (si nécessaire), et tout aussi pratique, "STL" continuera à être utilisé et la confusion continuera.

81
Jerry Coffin

Le terme "STL" ou "Bibliothèque de modèles standard" n'apparaît nulle part dans la norme ISO 14882 C++. Il est donc faux de faire référence à la bibliothèque standard C++ en tant que STL. Le terme "bibliothèque standard C++" ou "bibliothèque standard" est ce qui est officiellement utilisé par ISO 14882:

Norme ISO 14882 C++:

17 - Introduction à la bibliothèque [lib.library]:

  1. Cette clause décrit le contenu de la bibliothèque standard C++ , comment un programme C++ bien formé utilise-t-il la bibliothèque, et comment une implémentation conforme peut fournir les entités de la bibliothèque.

...

STL est une bibliothèque conçue à l'origine par Alexander Stepanov, indépendante du standard C++. Cependant, certains composants de la bibliothèque standard C++ incluent des composants STL tels que vector, list et des algorithmes tels que copy et swap.

Mais bien sûr, la norme C++ inclut beaucoup plus d'éléments en dehors de la STL, de sorte que le terme "bibliothèque standard C++" est plus correct (et est ce qui est réellement utilisé par les documents de normes).

47
In silico

J'ai récemment avancé le même argument, mais je pense qu'un peu de tolérance peut être toléré. Si Scott Meyers commet la même erreur, vous êtes en bonne compagnie.

22
Mark Ransom

De la FAQ de la bibliothèque GNU standard C++ (libstdc ++) :


La STL (bibliothèque de modèles standard) a été l'inspiration pour les gros morceaux de la bibliothèque standard C++, mais les termes ne sont pas interchangeables et ils ne signifient pas la même chose. La bibliothèque standard C++ comprend de nombreuses choses qui ne proviennent pas de la STL, et certaines d'entre elles ne sont même pas des modèles, tels que std::locale et std::thread.

Libstdc ++ - v3 incorpore beaucoup de code provenant de la STL de SGI (la fusion finale provenait de version 3. ). Le code dans libstdc ++ contient de nombreux correctifs et modifications par rapport au code SGI d'origine.

En particulier, string ne provient pas de SGI et n'utilise pas leur classe "corde" (bien que celle-ci soit incluse en tant qu'extension facultative), ni valarray ni certaines autres. Des classes comme vector<> provenaient de SGI, mais ont été modifiées de façon importante.

Pour plus d'informations sur l'évolution de libstdc ++, consultez la documentation évolution de l'API et compatibilité ascendante .

La lecture FAQ de la STL de SGI est toujours recommandée.


Pour votre information, à compter de mars 2018, même le site Web officiel de la STL www.sgi.com/tech/stl/ a dispar .

3
vstepaniuk