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

514
有人向我提起这篇文章,声称(我是在转述)STL术语被误用来指代整个C++标准库,而不是从SGI STL中引入的部分。
尽管很少有人仍在使用STL(这是由SGI设计的),但C++标准库的部分功能是基于STL的部分功能实现的,许多人(包括几位作者和以错误信息著称的cplusplus.com)仍然将其称为“STL”。然而,这是不准确的;事实上,C++标准从未提到过“STL”,而且两者之间存在内容差异。
人们认为“STL”很少用于指代基于SGI STL的stdlib的一些部分。它被放在简历上。这是具有误导性的。
我对C++的历史知之甚少,因此无法判断文章的正确性。我应该避免使用STL术语吗?还是这只是个别观点?

69
人们需要好的名称来描述事物。Stepanov 的天才改变了我们编程的方式。像“标准库编程”这样的名称完全无法描述它。称其为“STL编程”,每个人都知道你的意思。争论这一点只是错过了重点:我们需要一个好名称。 - Hans Passant
39
@Hans:不,是你误解了重点:“‘每个人都知道你的意思’是不准确的。” - Lightness Races in Orbit
20
我不知道你的意思。 - Hans Passant
24
这是一个完美的例子,有人在使用“STL”来指代整个C++标准库。令我困惑的是,很多人发誓没有人会这样做,但事实上几乎每天都能看到这种用法。 - Lightness Races in Orbit
19
在Stack Overflow上搜索"stl streams",共有2747个结果。 - Lightness Races in Orbit
显示剩余9条评论
7个回答

643

在C++标准化之前,"STL"是由Alexander Stepanov编写的。尽管C++存在于80年代,但我们现在所说的"C ++"是由ISO / IEC 14882:2014(以及早期版本,如ISO / IEC 14882:2011)标准化的语言。

作为C ++库,STL已经被广泛地使用,使程序员可以访问容器、迭代器和算法。当标准化发生时,语言委员会设计了C ++标准库的一些部分(它是语言标准的一部分),以非常接近STL。

多年来,许多人 - 包括著名的书籍作者和各种网站 - 仍将C ++标准库称为"STL",尽管这两个实体是独立的,并且存在一些差异。在即将到来的新版C ++标准中,这些差异更加明显,该标准包括各种特性并显着改变了一些类。

原始的STL现在通常被称为" C ++ Standard Template Library的一种实现"(与实际历史相反!),就像您的Microsoft Visual Studio或GCC提供了C ++标准库的实现一样。但是,“Standard Template Library”和“Standard Library”并不是同一件事。

争论的焦点在于当前的标准库是否应该整体或部分地称为"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
标准模板库不仅仅是由Stepanov和Lee创建的,他们当时还在软件技术实验室工作。 - Kragen Javier Sitaker
22
今天有人问到std::iota头文件在哪里,因为他无法让其正常工作。它是一个SGI非标准扩展,当他们认为适合时就称其为“标准”,因为它是“STL”,而每个人都知道“STL”是C++标准库的一部分,对吧?它是在C++0x中引入的,但在C++03中不可用。Grrr. - Lightness Races in Orbit
47
MS STL是由Stephan T. Lavavej(又称STL)维护的。 - Mihaela
14
显然,即使是STL本人也将“STL”用来表示整个东西。 - Lightness Races in Orbit
29
Bjarne Stroustrup在《C++程序设计语言》第四版中明确区分了STL与标准库的其他部分。 - codenheim
显示剩余27条评论

92

没有一个确切的答案是正确的。Alexander Stepanov在任职惠普期间开发了一个他称为STL的库。然后,该库被提议纳入C++标准。

这基本上“分叉”了开发。委员会包括了一些部分,完全拒绝了其他部分,并重新设计了一些部分(与Alexander的参与)。原始库的开发后来转移到了硅谷图形公司,但与C++标准库分开进行。

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

有些人也将STL简单地用作“STandard Library”的缩写。

这意味着当有人使用术语“STL”时,他们可能指的是大约半打不同的事物之一。无论是好是坏,大多数使用它的人似乎忽略了多样性的含义,并假设每个人都会认识他们所指的内容。这导致了许多误解,至少有几次严重的火药战使大多数参与者看起来很蠢,因为他们只是在谈论完全不同的事情。

不幸的是,这种混淆很可能会持续下去。引用“STL”比引用“C++标准库中的容器、迭代器和算法,但不包括std::string,即使它可以像容器一样使用”更加方便。即使“C++标准库”并不像那么冗长和笨拙,“STL”仍然更短、更简单。除非有人发明出同样方便的更精确的术语(必要时),否则“STL”将继续被使用,混淆也将继续产生。


6
@Jerry:是前者,"std"就是表示这个意思。 :) - Lightness Races in Orbit
7
@Jerry:不确定命名空间有什么关系。符合规范的实现不会向命名空间std中添加任何内容。我所说的是“stdlib”中的“std”,它代表“standard”(标准)。“std”代表的意思相当明确! - Lightness Races in Orbit
4
@Jerry:我真的不认为期望某人把形容词“standard”读作“这是标准的”是牵强的。同时,17.4.3.1/1非常清楚,除非在某些特定的命名情况下,否则向命名空间std添加内容是未定义行为:这些添加情况在标准中有明确的命名,因此仍然完全合规;“standard”仍然适用。 - Lightness Races in Orbit
2
SGI和HP的历史是倒置的。Stepanov在加入SGI之前曾在HP工作过。 - Kragen Javier Sitaker
2
我刚刚重新阅读了这里的评论,并认为值得再添加一个(尽管是次要的)观点:我认为期望“标准”总是意味着“这在标准中”有些牵强。特别是,在C++程序员中,许多人早在没有标准之前就使用了“标准库”这个短语。如果有人认为他们是指C标准库中的库,则我会指出,在C标准甚至还没有(草案)之前,C程序员也是如此。 - Jerry Coffin
显示剩余3条评论

64
“STL”或“Standard Template Library”这个术语在ISO 14882 C++标准中没有出现过。因此,将C++标准库称为STL是错误的。ISO 14882正式使用“C++标准库”或“标准库”一词:
ISO 14882 C++标准: 17-库介绍[lib.library]:
1.本节描述了C++标准库的内容,描述了符合规范的实现如何提供库中的实体以及一个正确形成的C++程序如何使用库。
...
STL是由Alexander Stepanov最初设计的一个独立于C++标准的库。然而,一些C++标准库组件包括STL组件,例如vector、list和诸如copy和swap之类的算法。
但当然,C++标准库还包括许多STL之外的东西,因此术语“C++标准库”更为正确(并且实际上是标准文档中使用的)。

9
尽管在STL中没有std命名空间(如果我没记错的话),但仍然如此。 - Lightness Races in Orbit
2
当时,大多数的C++编译器都没有实现命名空间。事实上,我不知道它们是否甚至被列入标准中。 - Kragen Javier Sitaker
6
@Kragen: 好的,当时没有标准。 - Lightness Races in Orbit
4
哦,好的。嗯,有一些 Stroustrup 的书,但我想那可能不完全是同一个意思,对吧? - Kragen Javier Sitaker

24

我最近也提出了这个观点,但我认为应该容许一些宽容度。如果Scott Meyers犯了同样的错误,那你就有了一个好榜样。


3
@Tomalak & @Mark:实际上,Scott对此并没有减分给我。这本书确实是关于STL的,意思是“源自Stepanov图书馆的std库的部分”。花点时间看一下书的目录吧。我能找到的唯一超出原始STL范围的东西是std::string,而它已经被装备成为一个完整的STL容器。 - sbi
1
@sbi:显然你误解了我的立场。我不会像Scott那样使用“STL”。请阅读我的回答。 - Lightness Races in Orbit
6
@Tomalak,我也不会像那样使用“STL”,尽管过去我可能有这种错误。我只是认为这并不值得责备别人。 - Mark Ransom
2
我能够尊重这一点。我最反感的是那些拒绝承认潜在歧义的人。 :) - Lightness Races in Orbit
12
您将与Bjarne Stroustrup一起合作 - 参考文献例如:http://www.stroustrup.com/DnE2005.pdf:“STL(即ISO C ++标准库的容器和算法框架)”。 - Sander De Dycker
显示剩余3条评论

14

来自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/已经消失。


-3
简单来说:STL是标准库的一部分。
C++标准库分为以下几个部分:
  1. 标准函数库 -输入/输出, -字符串和字符处理, -数学, -时间、日期和本地化, -动态分配, -杂项, -宽字符函数

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

因此,如果您谈论STL作为标准库,那么没问题,只需记住STL实现允许泛型,而其他实现则更具体于一种类型。
请参考https://www.tutorialspoint.com/cplusplus/cpp_standard_library.htm

-4

C++标准库包含C++ STL

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

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

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


6
虽然STL的部分内容被纳入了C++98标准库,但并不是只有STL、IOStream和C语言相关的东西才在标准库中。即使是C++98标准库也不是这样。 - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接