Quelqu'un a attiré mon attention sur cet article qui prétend (je paraphrase) que le terme STL est utilisé à mauvais escient pour faire référence à l'ensemble de la bibliothèque standard C ++ au lieu des parties qui ont été extraites de SGI STL.
(...) il fait référence à la "STL", malgré le fait que très peu de gens utilisent encore la STL (qui a été conçue chez SGI).
Certaines parties de la bibliothèque standard C ++ étaient basées sur des parties de la STL, et ce sont ces parties que de nombreuses personnes (y compris plusieurs auteurs et le cplusplus.com connu pour ses erreurs) se réfèrent toujours à "la STL". Cependant, c'est inexact; en effet, le standard C ++ ne mentionne jamais "STL", et il existe des différences de contenu entre les deux.
(...) "STL" est rarement utilisé pour faire référence aux bits de la stdlib qui se trouvent être basés sur la SGI STL. Les gens pensent que c'est toute la bibliothèque standard. Il est mis sur les CV. Et c'est trompeur.
Je ne connais pratiquement rien de l'histoire de C ++, je ne peux donc pas juger de l'exactitude de l'article. Dois-je m'abstenir d'utiliser le terme STL? Ou s'agit-il d'une opinion isolée?
Réponses:
Le "STL" a été écrit par Alexander Stepanov dans les jours qui ont précédé la normalisation de C ++. Le C ++ a existé dans les années 80, mais ce que nous appelons maintenant « C ++ » est le langage normalisé dans ISO / IEC 14882: 2014 (et les versions antérieures, comme ISO / IEC 14882: 2011).
La STL était déjà largement utilisée comme bibliothèque pour C ++, donnant aux programmeurs l'accès aux conteneurs, aux itérateurs et aux algorithmes. Lorsque la normalisation a eu lieu, le comité de langue a conçu des parties de la bibliothèque standard C ++ (qui fait partie de la norme de langage) pour correspondre très étroitement à la STL.
Au fil des ans, de nombreuses personnes - y compris d'éminents auteurs de livres et divers sites Web - ont continué à appeler la bibliothèque standard C ++ "la STL", malgré le fait que les deux entités sont distinctes et qu'il existe des différences. Ces différences sont encore plus prononcées dans la nouvelle norme C ++ à venir, qui comprend diverses fonctionnalités et modifie considérablement 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 dans l'historique réel!), De la même manière que votre 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 est de savoir si la bibliothèque standard actuelle doit être appelée "la STL" en tout ou en partie, et / ou si elle importe comment elle s'appelle.
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 pensent 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, dont une grande partie fait un usage intensif de la fonctionnalité C ++ connue sous le nom de "modèles".
Pour "Bibliothèque standard C ++" (ou stdlib)
Cependant, il existe une autre école de pensée - à laquelle je souscris - qui dit que cela prête à confusion. Les personnes qui apprennent le C ++ pour la première fois ne connaissent pas cette distinction et peuvent ne pas remarquer de petites différences de langage.
L'auteur de cet article a rencontré à plusieurs reprises des gens qui pensent que la bibliothèque standard C ++ entière est la STL, y compris des fonctionnalités qui n'ont jamais fait partie de la STL elle-même. La plupart des partisans vocaux de "la STL", en revanche, savent exactement ce qu'ils entendent par là et refusent de croire que tout le monde "ne comprend pas". De toute évidence, l'utilisation du terme n'est pas uniforme.
De plus, il existe des bibliothèques de type STL qui sont en fait des implémentations de la STL d'origine, pas la bibliothèque standard C ++. Jusqu'à récemment, STLPort était l'un d'entre eux (et même là, la confusion abonde!).
En outre, la norme C ++ ne contient le texte «STL» nulle part, et certaines personnes utilisent habituellement des expressions comme «la STL est incluse dans la bibliothèque standard C ++», ce qui est tout à fait incorrect.
Je suis convaincu que continuer à propager l'utilisation du terme de cette manière ne fera que conduire à l'incompréhension pour toujours. Hélas, il peut être totalement contre-productif d'essayer de changer les choses, même si c'est censé être pour le mieux. Nous pouvons juste être coincés avec des significations doubles pour toujours.
Conclusion
J'apprécie que ce post ait été un peu biaisé: j'ai écrit l'article auquel vous avez lié. :) Quoi qu'il en soit, j'espère que cela aidera à expliquer un peu mieux la bataille.
Mise à jour 13/04/2011
Voici trois exemples parfaits de quelqu'un qui utilise "la STL" pour faire référence à l'ensemble de la bibliothèque standard C ++. Cela continue de me dérouter que tant de gens jurent aveugles que personne ne le fasse jamais, alors qu'il est évident de le voir presque quotidiennement.
la source
std::iota
était, parce qu'il ne pouvait pas le faire fonctionner. C'est une extension SGI non standard , qu'ils appellent "standard" quand cela leur convient car c'est "la STL", et tout le monde sait que "la STL" fait partie de la bibliothèque standard C ++, non? Et il a été introduit en C ++ 0x, mais n'est pas disponible en C ++ 03. Grrr.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 "fourchu". Le comité comprenait certaines parties, en rejetait complètement d'autres et en remodelait 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 ++.
Après ces morceaux ont été ajoutés à la bibliothèque standard, d'autres parties de la bibliothèque standard ont été modifiés pour s'adapter mieux avec ce qui a été ajouté (par exemple
begin
,end
,rbegin
etrend
ont été ajoutées àstd::string
afin qu'il puisse être utilisé comme un récipient). Vers la même époque, la plupart de la bibliothèque (même des pièces qui n'étaient absolument pas liées) ont été transformées en modèles pour s'adapter à différents types (par exemple, les flux standard).Certaines personnes utilisent également STL comme une simple forme abrégée de "bibliothèque standard".
Cela signifie que lorsque quelqu'un utilise le terme "STL", il peut faire référence à environ 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 tout le monde reconnaîtra à quoi ils se réfèrent. Cela conduit à de nombreux malentendus, et au moins à quelques guerres de flammes graves qui ont rendu la plupart des participants stupides parce qu'ils parlaient simplement de choses entièrement différentes.
Malheureusement, la confusion devrait se poursuivre sans relâche. Il est beaucoup plus pratique de faire référence à "STL" qu'à quelque chose comme "les conteneurs, les itérateurs et les algorithmes dans la bibliothèque standard C ++, mais sans les inclure
std::string
, même s'il peut agir comme un conteneur". Même si la "bibliothèque standard C ++" n'est pas aussi longue et maladroite que cela, "STL" est toujours beaucoup plus courte et plus simple. Jusqu'à ou à moins que quelqu'un n'invente des termes plus précis (si nécessaire) et tout aussi pratiques, "STL" continuera à être utilisé et la confusion continuera à en résulter.la source
std
. Je parlais du "std" dans "stdlib", qui signifie "standard". Je pense que c'est assez clair ce que cela signifie!std
est UB sauf dans certains cas spécifiques nommés: ces cas d'addition sont nommés dans la norme, et sont donc toujours parfaitement conformes; «standard» continuerait de s'appliquer.Le terme «STL» ou «bibliothèque de modèles standard» n'apparaît nulle part dans la norme ISO 14882 C ++. Donc, faire référence à la bibliothèque standard C ++ comme STL est faux. Le terme «bibliothèque standard C ++» ou «bibliothèque standard» est ce qui est officiellement utilisé par ISO 14882:
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 comme
vector
,list
et des algorithmes commecopy
etswap
.Mais bien sûr, la norme C ++ comprend beaucoup plus de choses en dehors de la STL, donc le terme "bibliothèque standard C ++" est plus correct (et c'est ce qui est réellement utilisé par les documents de normes).
la source
std
espace de noms (IIRC).J'ai fait ce même argument récemment, mais je crois qu'un peu de tolérance peut être autorisée. Si Scott Meyers fait la même erreur, vous êtes en bonne compagnie.
la source
-1
de moi. Le livre traite en effet de la STL au sens de "les parties de la lib std issues de la bibliothèque de Stepanov". Prenez le temps de parcourir les livres TOC. La seule chose en dehors de la STL d'origine que j'ai pu trouver étaitstd::string
, et qui avait été équipée pour être un conteneur STL à part entière.De la FAQ GNU Standard C ++ Library (libstdc ++) :
La STL (Standard Template Library) a été l'inspiration pour de gros morceaux de la bibliothèque standard C ++, mais les termes ne sont pas interchangeables et 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, comme
std::locale
etstd::thread
.Libstdc ++ - v3 incorpore beaucoup de code de la SGI STL (la fusion finale était de la version 3.3 ). Le code de libstdc ++ contient de nombreux correctifs et modifications par rapport au code SGI d'origine.
En particulier,
string
n'est pas de SGI et ne fait pas usage de leur classe "corde" (bien que cela soit inclus comme une extension facultative), ni l'unvalarray
ni l'autre. Des cours commevector<>
de SGI, mais ont été profondément modifiées.Pour plus d'informations sur l'évolution de libstdc ++, consultez le évolution de API et la compatibilité descendante .
le FAQ pour la STL de SGI est toujours recommandée.
Pour info, depuis mars 2018, même le site Web officiel de la STL www.sgi.com/tech/stl/ a disparu .
la source