“STL"”之间有什么区别?和“c++标准库”;?

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

(…)它指的是“STL”,尽管事实上很少有人仍然使用STL(它是在SGI设计的)。

c++标准库的一部分是基于STL的部分,许多人(包括一些作者和臭名昭著的错误缠身的cplusplus.com)仍然将这些部分称为“STL”。然而,这是不准确的;事实上,c++标准从来没有提到“STL";两者之间存在内容差异。

(…)“STL"很少用来指碰巧基于SGI STL的stdlib的位。人们认为这是整个标准库。它会被写在简历上。这是一种误导。

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

110807 次浏览

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

ISO 14882 c++标准:

17 -图书馆简介[lib.library]:

  1. 这个子句描述了 c++标准库的内容,how 一个格式良好的c++程序所使用的 图书馆里,又怎么一个规规矩矩的 实现可以提供

...

STL是一个最初由Alexander Stepanov设计的库,独立于c++标准。然而,c++标准库的一些组件包括STL组件,如vectorlist和算法,如copyswap

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

早在c++被标准化之前,“STL”是亚历山大·斯捷潘诺夫写的。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++标准库分开继续。

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

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

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

不幸的是,这种混乱可能会继续有增无减。引用“STL”要比引用“c++标准库中的容器、迭代器和算法,但不包括std::string,尽管它可以像容器一样工作”这样的东西方便得多。尽管“c++标准库”没有那么长和笨拙,“STL”仍然要短得多和简单得多。除非(或除非)有人发明更精确(必要时)的术语,而且同样方便,否则“STL”将继续被使用,混淆将继续产生。

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


STL(标准模板库)是c++标准库的灵感来源,但是这些术语是不可互换的,它们的意思也不同。c++标准库包含了很多不是来自STL的东西,其中一些甚至不是模板,比如std::localestd::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++标准库的内容是:

  1. c++版本的C语言头文件
  2. c++ IO头文件
  3. c++ STL

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

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

c++标准库分为:

  1. 标准函数库 i / O, -字符串和字符处理, 数学, 时间,日期和本地化, 动态分配, 杂, 宽字符函数< / p >

  2. 标准OOP和泛型库 -标准c++ I/O类 -字符串类 -数字类 - STL容器类 - STL算法 - STL函数对象 - STL迭代器 - STL分配器 -本地化库 -异常处理类 -杂项支持库

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

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