有人让我注意到这篇文章,声称STL术语被误用来指代整个c++标准库,而不是从SGI STL中提取的部分。

(...) it refers to the "STL", despite the fact that very few people still use the STL (which was designed at SGI). Parts of the C++ Standard Library were based on parts of the STL, and it is these parts that many people (including several authors and the notoriously error-ridden cplusplus.com) still refer to as "the STL". However, this is inaccurate; indeed, the C++ standard never mentions "STL", and there are content differences between the two. (...) "STL" is rarely used to refer to the bits of the stdlib that happen to be based on the SGI STL. People think it's the entire standard library. It gets put on CVs. And it is misleading.

我对c++的历史几乎一无所知,所以我无法判断这篇文章的正确性。我应该避免使用STL这个术语吗?或者这只是一个孤立的观点?


术语“STL”或“标准模板库”在ISO 14882 c++标准中没有出现。因此,将c++标准库称为STL是错误的。术语“c++标准库”或“标准库”是ISO 14882正式使用的:

ISO 14882 c++标准: 17 -图书馆简介[lib.library]: 本子句描述了c++标准库的内容 一个格式良好的c++程序所使用的 图书馆里,又怎么一个规规矩矩的 实现可以提供 库中的实体。 ...

STL是一个最初由Alexander Stepanov设计的库,独立于c++标准。然而,c++标准库的一些组件包括STL组件,如向量、列表和算法,如复制和交换。

当然,c++标准包含了STL之外的更多东西,所以术语“c++标准库”更正确(并且是标准文档实际使用的)。


“STL”是Alexander Stepanov在c++被标准化之前写的。c++存在于80年代,但我们现在所说的“c++”是ISO/IEC 14882:2014(以及更早的版本,如ISO/IEC 14882:2011)中标准化的语言。

STL已经被广泛用作c++的库,让程序员可以访问容器、迭代器和算法。当标准化发生时,语言委员会设计了c++标准库(语言标准的一部分)的部分,使之与STL非常匹配。

多年来,许多人——包括著名的书籍作者和各种网站——继续将c++标准库称为“STL”,尽管这两个实体是分开的,并且存在一些差异。这些差异在即将到来的新c++标准中更加明显,该标准包含了各种特性,并显著地改变了一些类。

最初的STL现在经常被称为“c++标准模板库的实现”(相当回溯到实际的历史!),就像你的Microsoft Visual Studio或GCC发布c++标准库的实现一样。但是“标准模板库”和“标准库”不是一回事。

这场争论是关于当前的标准库应该被称为“STL”还是全部或部分,以及/或它的名称是否重要。

对于“STL”

有一种观点认为,现在每个人都知道“STL”意味着标准库,就像现在每个人都知道“c++”是iso标准化语言一样。

它还包括那些认为只要各方都明白在谈论什么就无所谓的人。

这一术语由于其本质而变得更加流行,其中很多都大量使用了c++的“模板”特性。

用于“c++标准库”(或stdlib)

然而,还有另一种思想流派——我也同意——认为这是令人困惑的。第一次学习c++的人不知道这个区别,可能不会注意到小的语言差异。

那篇文章的作者多次遇到这样的人,他们认为整个c++标准库就是STL,包括一些从来不属于STL本身的特性。相比之下,大多数“STL”的支持者清楚地知道他们的意思,并拒绝相信不是每个人都“理解它”。显然,这个术语的用法并不统一。

此外,还有一些类似STL的库,它们实际上是原始STL的实现,而不是c++标准库。直到最近,STLPort也是其中之一(即使在那里,也存在很多困惑!)。

此外,c++标准在任何地方都不包含“STL”文本,有些人习惯性地使用像“STL包含在c++标准库中”这样的短语,这是完全不正确的。

我相信,继续以这种方式传播这个术语的用法只会导致永远的误解。唉,试图改变事情可能会完全适得其反,即使它应该是更好的。我们可能会永远被双重意义所困。

结论

我知道这篇文章有一点偏见:你链接的那篇文章是我写的。不管怎样,我希望这有助于更好地解释这场战斗。

更新13/04/2011

这里有三个用“STL”来指代整个c++标准库的完美例子。让我一直困惑的是,有那么多人信誓拈来,没有人会这么做,而这几乎是每天都能看到的。


我最近也提出了同样的观点,但我相信可以容忍一点。如果斯科特·迈耶斯犯了同样的错误,你也有很多同伴。


没有一个答案是正确的。Alexander Stepanov开发了一个名为STL的库(当时为惠普工作)。该库随后被提议包含在c++标准中。

这基本上就是“分叉”开发。委员会包括了一些部分,完全拒绝了其他部分,并重新设计了一些(亚历山大的参与)。原始库的开发后来转移到Silicon Graphics,但与c++标准库分开继续。

在这些片段被添加到标准库之后,标准库的一些其他部分被修改以更好地适应所添加的内容(例如,begin, end, rbegin和rend被添加到std::string中,这样它就可以像容器一样使用)。大约在同一时期,大多数库(甚至是完全不相关的部分)都被制作成模板,以适应不同的类型(例如,标准流)。

有些人也将STL仅仅作为“标准库”的缩写形式使用。

这意味着当有人使用“STL”这个术语时,他们可能指的是六种不同事物中的任何一种。不管是好是坏,大多数使用这个词的人似乎忽略了其含义的多样性,并认为其他人都能认出他们指的是什么。这导致了许多误解,至少有一些严重的口水仗,让大多数参与者看起来很愚蠢,因为他们只是在谈论完全不同的事情。

Unfortunately, the confusion is likely to continue unabated. It's much more convenient to refer to "STL" than something like "the containers, iterators, and algorithms in the C++ standard library, but not including std::string, even though it can act like a container." Even though "C++ standard library" isn't quite as long and clumsy as that, "STL" is still a lot shorter and simpler still. Until or unless somebody invents terms that are more precise (when necessary), and just as convenient, "STL" will continue to be used and confusion will continue to result.


从GNU标准c++库(libstdc++)常见问题解答:


STL(标准模板库)是c++标准库的灵感来源,但是这些术语是不可互换的,它们的意思也不同。c++标准库包含了很多不是来自STL的东西,其中一些甚至不是模板,比如std::locale和std::thread。

libstdc++ -v3合并了大量来自SGI STL的代码(最终的合并来自发布版 3.3)。与原始SGI代码相比,libstdc++中的代码包含许多修复和更改。

特别是,string不是来自SGI,也没有使用它们的“rope”类(尽管这是作为可选扩展包含的),valarray和其他一些类也是如此。像vector<>这样的类来自SGI,但已被广泛修改。

关于libstdc++发展的更多信息,可以在API发展和向后兼容性文档中找到。

SGI的STL常见问题解答仍然是推荐阅读的。


仅供参考,截至2018年3月,甚至连STL官方网站www.sgi.com/tech/stl/都消失了。


c++标准库包括c++ STL

c++标准库的内容是:

c++版本的C语言头文件 c++ IO头文件 c++ STL

所以请不要混淆c++标准库和STL。


通俗地说:STL是标准库的一部分。

c++标准库分为:

标准函数库 i / O, -字符串和字符处理, 数学, 时间,日期和本地化, 动态分配, 杂, 宽字符函数 标准OOP和泛型库 -标准c++ I/O类 -字符串类 -数字类 - STL容器类 - STL算法 - STL函数对象 - STL迭代器 - STL分配器 -本地化库 -异常处理类 -杂项支援图书馆

因此,如果你将STL作为标准库来讨论,这是可以的,只要记住STL实现允许泛型,而其他实现则更特定于一种类型。

请参考https://www.tutorialspoint.com/cplusplus/cpp_standard_library.htm