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


446

有人引起了我的注意,这篇文章声称(我的意思是) STL术语被误用来指代整个C ++标准库,而不是指从SGI STL中获得的部分。

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

C ++标准库的某些部分是基于STL的,因此很多人(包括数位作者和臭名昭著的cplusplus.com)仍然将这些部分称为“ STL”。但是,这是不准确的。实际上,C ++标准从不提及“ STL”,并且两者之间存在内容差异。

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

我几乎不了解C ++的历史,因此我无法判断本文的正确性。我应该避免使用术语STL吗?还是这是一个孤立的意见?


62
人们需要用好名字来形容事物。Stepanov的天才改变了我们编程的方式。像“标准库编程”这样的名称完全没有用。称之为“ stl编程”,每个人都知道您的意思。关于这一点的争论只是忽略了重点:我们需要一个好名字。
汉斯·帕桑

34
@汉斯:不,错过了重点:“ 每个人都知道你的意思” 不是真的
Lightness Races in Orbit

16
我不知道你的意思。
汉斯·帕桑

21
是一个使用“ STL”来引用整个C ++标准库的人的完美示例。令我感到困惑的是,有如此多的人发誓盲目,而几乎每天都可以看到的情况下,没人能做到这一点。
Lightness Races in Orbit

Answers:


571

“ 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”,并且有些人习惯使用诸如“ C ++标准库中包含 STL”之类的短语,这显然是错误的。

我相信,以这种方式继续传播该术语的用法只会导致永远的误解。las,尝试改变事物可能完全适得其反,即使应该做得更好。我们可能永远只是双重含义。

结论

我感谢这篇文章有些偏颇:我写了您链接到的文章。:)无论如何,我希望这有助于更好地解释这场战斗。

更新13/04/2011

这是三个 使用“ STL”来引用整个C ++标准库的人的完美 示例。令我感到困惑的是,有这么多人发誓盲目,几乎每天都可以看到的情况下,没有人这样做。


136
小号 TANDARD 牛逼 emplate 大号 ibrary不是只创造 epanov和大号 EE,但他们也在努力小号 oftware 牛逼李有成大号当时aboratory。
Kragen Javier Sitaker 2011年

21
今天有人问标头std::iota在里面,因为他无法使用标头。这是SGI的非标准扩展,由于它是“ STL”,因此在适合时称为“标准”,每个人都知道“ STL”是C ++标准库的一部分,对吗?它在C ++ 0x中引入,但在C ++ 03中不可用。rr
Lightness Races in Orbit,

40
MS STL由S tephan T维护。L avavej,又称STL。
Mihaela 2012年


26
Bjarne Stroustrup在“ canon”(C ++编程语言第4版)中特别区分了STL和标准库的其他部分。
codenheim 2014年

84

没有一个答案是正确的。Alexander Stepanov开发了一个名为STL的库(当时在HP工作)。然后建议将该库包含在C ++标准中。

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

将这些片段添加到标准库之后,对标准库的其他一些部分进行了修改,以使其与所添加的内容更好地匹配(例如,beginendrbegin然后rend添加到其中,std::string以便可以像容器一样使用)。大约在同一时间,大多数库(甚至是完全不相关的部分)被制成模板以容纳不同类型(例如标准流)。

有些人也将STL用作“标准库”的简称。

这意味着当有人使用“ STL”一词时,他们可能指的是大约六种不同的事物中的任何一种。不管是好是坏,大多数使用它的人似乎都忽略了意义的多重性,并假设其他人都会认识到他们所指的是什么。这导致了许多误解,并且至少发生了几场严重的大战,使大多数参与者看上去很愚蠢,因为他们只是在谈论完全不同的事情。

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


5
@Jerry:前者;这就是“ std”的意思。:)
在轨道进行的竞速比赛

6
@Jerry:不确定名称空间会出现在哪里。兼容的实现不会向名称空间添加任何内容std。我说的是“ stdlib”中的“ std”,它代表“标准”。我认为这很清楚!
Lightness竞赛,

3
@杰里:我真的不认为期望有人将形容词“标准”读为“这是标准”是很费力的。同时,17.4.3.1/1很清楚,std除了在某些特定的命名情况下,向名称空间添加内容是UB:这些添加的情况在标准中进行了命名,因此仍然完全符合要求;“标准”仍然适用。
Lightness竞赛,

1
这里的SGI和HP的历史是倒退的。Stepanov在加入SGI之前曾在惠普任职。
Kragen Javier Sitaker 2011年

2
我只是在这里重新阅读了评论,并认为有必要再增加一点(公认是次要的):我认为期望“标准”始终表示“这是标准中的”有点困难。特别是,许多C ++程序员使用多久就有了那句“标准库” 一个标准。唯恐有人认为他们指的是C标准中的库,我要指出的是,在C标准(甚至是C标准草案)出现之前,C程序员也是如此。
杰里·科芬

52

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

ISO 14882 C ++标准:

17-库简介[lib.library]:

  1. 本条款描述了C ++标准库的内容,格式正确的C ++程序如何使用该库以及符合标准的实现方式如何在库中提供实体。

...

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

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


5
+1。尽管在STL中没有std名称空间(IIRC)。
Lightness Races in Orbit

1
当时,大多数C ++编译器都没有实现名称空间。实际上,我不知道它们是否符合标准。
Kragen Javier Sitaker

3
@克拉根:嗯,没有标准。
Lightness Races in Orbit

3
哦。好吧,有一些Stroustrup的书,但是我想那不是完全一样的东西,对吗?
Kragen Javier Sitaker '10

23

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


@Tomalak&@Mark:实际上,斯科特不是-1我的。这本书的确是关于STL的,意思是“来自Stepanov库的std lib部分”。花时间浏览书籍目录。除了原始STL之外,我唯一能找到的就是std::string,而该STL 已配备成功能完善的STL容器。
2011年

@sbi:您显然误解了我的立场。我不会像Scott那样使用“ STL”。请阅读我的答案。
Lightness Races in Orbit

6
@Tomalak,我也不会那样使用“ STL”,尽管过去我可能对此感到内it。我只是不认为殴打别人是值得的。
Mark Ransom'3

1
我可以尊重。对于那些根本不承认潜在歧义的人,我感到最困惑。:)
轻轨比赛将于

11
您也将在Bjarne Stroustrup公司-参考。例如。stroustrup.com/DnE2005.pdf:“ STL(“标准模板库”;即ISO C ++标准库的容器和算法框架)”
Sander De Dycker 2014年

7

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


STL(标准模板库)是C ++标准库大块代码的灵感来源,但这些术语不可互换,并且含义不相同。C ++标准库包含许多不是来自STL的东西,其中一些甚至都不是模板,例如std::localestd::thread

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

特别是,string它不是来自SGI,并且不使用其“绳索”类(尽管作为可选扩展包含在内),也valarray没有使用。类似的类vector<>来自SGI,但已进行了广泛的修改。

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

仍建议阅读有关SGI STL 的FAQ


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.