“STL”和“C++ 标准库”有什么区别?

What's the difference between "STL" and "C++ Standard Library"?

提问人:Pieter 提问时间:3/6/2011 最后编辑:CommunityPieter 更新时间:1/25/2021 访问量:117610

问:

有人提请我注意这篇文章,声称(我是转述)STL术语被误用来指整个C++标准库,而不是从SGI STL中获取的部分。

(...)它指的是“STL”,尽管很少有人仍然使用STL(由SGI设计)。

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

(...)“STL”很少用于指代恰好基于 SGI STL 的 stdlib 位。人们认为它是整个标准库。它被放在简历上。这是误导性的。

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

C stl std 标准库 c++- faq

评论

69赞 Hans Passant 3/6/2011
人们需要好名字来描述事物。斯捷潘诺夫的天才改变了我们的编程方式。像“标准库编程”这样的名称完全无法描述它。称它为“stl 编程”,每个人都知道你的意思。争论这一点只是忽略了重点:我们需要一个好名字。
1赞 Lightness Races in Orbit 3/8/2011
@Hans:所以请阅读这篇文章,以及下面的所有答案。我不明白“不,你错了,不是每个人都知道你的意思”有什么令人困惑的。
24赞 Lightness Races in Orbit 4/13/2011
这是一个使用“STL”来指代整个 C++ 标准库的人的完美示例。令我感到困惑的是,这么多人发誓说没有人这样做过,而几乎每天都能看到这一点。
19赞 Lightness Races in Orbit 4/19/2011
Stack Overflow 上的“stl streams”有 2,747 个结果
2赞 Galik 5/21/2017
在这篇文章中,原作者将其称为C++标准草案库的一部分,stepanovpapers.com/BYTE_com.htm“标准模板库是数据结构(在 STL 中称为容器)和算法的框架,被接受为标准草案C++的一部分。Hewlett-Packard 已经将 STL 的参考实现纳入了公共领域(可以从 butler.hpl.hp.com 下载),并且越来越多的商业供应商现在正在发布 STL。"STL1995

答:

64赞 In silico 3/6/2011 #1

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

ISO 14882 C++ 标准:

17 - 库介绍 [lib.library]:

  1. 此子句描述了 C++ 标准库的内容,如何 一个格式良好的 C++ 程序利用 库,以及如何符合 实现可以提供 库中的实体。

...

STL是一个最初由Alexander Stepanov设计的库,独立于C++标准。但是,C++ 标准库的某些组件包括 STL 组件(如 )和算法(如 和 )。vectorlistcopyswap

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

评论

9赞 Lightness Races in Orbit 3/6/2011
+1.虽然,在 STL 中,没有命名空间 (IIRC)。std
2赞 Kragen Javier Sitaker 3/15/2011
当时,大多数 C++ 编译器没有实现命名空间。事实上,我不知道他们是否在标准中。
6赞 Lightness Races in Orbit 9/20/2011
@Kragen:嗯,没有标准。
4赞 Kragen Javier Sitaker 10/7/2011
哦。好吧,斯特鲁斯特鲁普有一些书,但我想这并不完全是一回事,是吗?
645赞 Lightness Races in Orbit 3/6/2011 #2

“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++标准库。令我感到困惑的是,这么多人发誓说没有人这样做过,而几乎每天都能看到这一点。

评论

145赞 Kragen Javier Sitaker 3/15/2011
S tandard T emplate L ibrary 不仅由 Stepanov 和 L ee 创建,而且他们当时也在 Software Technology L堕胎室工作。
22赞 Lightness Races in Orbit 6/24/2011
今天有人问标题是什么,因为他无法让它工作。这是一个SGI非标准扩展,当它适合他们时,他们称之为“标准”,因为它是“STL”,每个人都知道“STL”是C++标准库的一部分,对吧?它是在 C++0x 中引入的,但在 C++03 中不可用。哎呀。std::iota
47赞 Mihaela 3/11/2012
MS STL 由 Stephan T 维护。Lavavej,又名 STL。
29赞 codenheim 8/16/2014
Bjarne Stroustrup在“经典”(C++编程语言第4版)中特别将STL与标准库的其他部分区分开来。
24赞 Mark Ransom 3/6/2011 #3

我最近也提出了同样的论点,但我相信可以允许一点宽容。如果斯科特·迈耶斯(Scott Meyers)犯了同样的错误,那么你就是一个很好的伙伴。

评论

3赞 sbi 3/10/2011
@Tomalak&@Mark:实际上斯科特没有,从我的角度来看。这本书确实是关于STL的,其含义是“源自Stepanov图书馆的std库的部分”。花点时间浏览书籍目录。在原来的 STL 之外,我唯一能找到的是 ,它已经配备了一个成熟的 STL 容器。-1std::string
1赞 Lightness Races in Orbit 3/10/2011
@sbi:你显然误解了我的立场。我不会像 Scott 那样使用“STL”。请阅读我的回答。
6赞 Mark Ransom 3/11/2011
@Tomalak,我也不会以这种方式使用“STL”,尽管我过去可能对此感到内疚。我只是觉得不值得殴打别人。
2赞 Lightness Races in Orbit 3/11/2011
我可以尊重。我对那些拒绝承认潜在模棱两可的人感到最愤怒。:)
12赞 Sander De Dycker 8/11/2014
你也会和 Bjarne Stroustrup 在一起 - 参考文献。stroustrup.com/DnE2005.pdf : “STL(”标准模板库“;即ISO C++标准库的容器和算法框架)”
93赞 Jerry Coffin 3/6/2011 #4

没有一个答案是真正正确的。亚历山大·斯捷潘诺夫(Alexander Stepanov)开发了一个名为STL的库(当时为惠普工作)。然后建议将该库包含在 C++ 标准中。

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

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

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

这意味着当有人使用术语“STL”时,他们可能指的是大约六种不同事物中的任何一种。无论好坏,大多数使用它的人似乎都忽略了含义的多重性,并假设其他人都会认出他们所指的内容。这导致了许多误解,以及至少一些严重的火焰战争,使大多数参与者看起来很愚蠢,因为他们只是在谈论完全不同的事情。

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

评论

6赞 Lightness Races in Orbit 3/6/2011
@Jerry:前者;这就是“STD”所代表的。:)
7赞 Lightness Races in Orbit 3/7/2011
@Jerry:不确定命名空间的出现位置。合规的实现不会向 namespace 添加任何内容。我说的是“stdlib”中的“std”,它代表“标准”。我想这意味着什么就很清楚了!std
4赞 Lightness Races in Orbit 3/7/2011
@Jerry:我真的不认为期望有人将形容词“标准”读作“这在标准中”是一件延伸的事情。同时,17.4.3.1/1 非常清楚地表明,除了某些特定的命名情况外,向命名空间添加内容是 UB:这些添加情况在标准中命名,因此仍然完全合规;“标准”仍然适用。std
2赞 Kragen Javier Sitaker 3/15/2011
这里的SGI和HP的历史是倒退的。斯捷潘诺夫在加入SGI之前就曾在惠普工作。
2赞 Jerry Coffin 12/18/2013
我只是重读了这里的评论,并认为值得再补充一点(诚然是次要的):我认为期望“标准”总是意味着“这在标准中”有点牵强。特别是,许多 C++ 程序员早在标准出现之前就使用了“标准库”一词。为了避免人们认为他们指的是 C 标准中的库,我要指出的是,早在 C 标准出现(甚至是草案)之前,C 程序员也是如此。
14赞 vstepaniuk 4/14/2018 #5

来自 GNU 标准 C++ 库 (libstdc++) 常见问题解答


STL(标准模板库)是 C++ 标准库大部分的灵感来源,但这些术语不可互换,它们的含义也不相同。C++ 标准库包含许多不是来自 STL 的东西,其中一些甚至不是模板,例如 和 .std::localestd::thread

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

特别是,不是来自SGI,也没有使用他们的“绳索”类(尽管这是作为可选扩展包含的),既不是也不是其他一些。像SGI这样的课程,但已经进行了广泛的修改。stringvalarrayvector<>

有关 libstdc++ 演进的更多信息,请参见 API 演进向后兼容性文档。

SGI STL的常见问题仍然值得推荐阅读。


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

-4赞 Cristime 8/2/2020 #6

C++ 标准库包括 C++ STL

C++ 标准库的内容包括:

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

因此,请不要将 C++ 标准库与 STL 混淆。

评论

6赞 Nicol Bolas 8/2/2020
虽然 STL 的某些部分确实被合并到 C++98 标准库中,但 STL、IOStream 和 C 的东西并不是标准库中唯一的内容。甚至是 C++98 标准库。
-3赞 Mohd Zaki Zakaria 9/12/2020 #7

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

C++ 标准库分为:

  1. 标准函数库 -I/O, -字符串和字符处理, -数学 -时间、日期和本地化, -动态分配, -杂项 -宽字符功能

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

因此,如果您谈论的是 STL 作为标准库,那没关系,请记住 STL 实现允许泛型,而其他实现则更特定于一种类型。

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