有人让我注意到这篇文章,声称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”是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++标准库的完美例子。让我一直困惑的是,有那么多人信誓拈来,没有人会这么做,而这几乎是每天都能看到的。

其他回答

“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++标准库的完美例子。让我一直困惑的是,有那么多人信誓拈来,没有人会这么做,而这几乎是每天都能看到的。

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

术语“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++标准库”更正确(并且是标准文档实际使用的)。