"STL"和"C++标准库"之间有什么区别?

Pie*_*ter 432 c++ stl std c++-faq c++-standard-library

有人把这篇文章给我的注意,声称(我意译)的STL长期被误指整个C++标准库,而不是从SGI STL中采取的部分.

(...)它指的是"STL",尽管很少有人仍然使用STL(在SGI设计).

C++标准库的一部分基于STL的一部分,正是这些部分,许多人(包括几位作者和臭名昭着的错误记录的cplusplus.com)仍然称为"STL".但是,这是不准确的; 事实上,C++标准从未提及"STL",两者之间存在内容差异.

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

我几乎不了解C++的历史,所以我不能判断文章的正确性.我应该避免使用术语STL吗?或者这是一个孤立的意见?

Lig*_*ica 558

"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++标准库的人的三个 完美 示例.它让我感到困惑的是,很多人发誓盲目,没有人会这样做,而且几乎每天都能看到这一点.

  • *S*标准*T*emplate*L*ibrary不仅由*St*epanov和*L*ee创建,但他们也在*S*oftware*T*技术*L*实验室工作. (136认同)
  • 并且MS STL由*S*tephan*T*维护.*L*avavej,又名STL. (39认同)
  • Bjarne Stroustrup在"canon",即C++编程语言第4版中明确区分了STL与标准库的其他部分. (26认同)
  • 今天有人问'std :: iota`是什么标题,因为他无法让它工作.[这是一个SGI非标准扩展](http://www.sgi.com/tech/stl/iota.html),当它适合他们时称为"标准",因为它是"STL",并且每个人都知道"STL"是C++标准库的一部分,对吧?它是在C++ 0x中引入的,但在C++ 03中不可用.哎呀. (21认同)
  • [显然,甚至STL自己使用"STL"来表示整个该死的地段](http://stackoverflow.com/a/14572050/560648) (12认同)
  • @LightnessRacesinOrbit我确实花了一些时间寻找一本使用术语"STL"的书来引用除标准库的*容器*,*iterators*和*算法*部分之外的其他东西而我无法找到它.我们都知道Straustrup,Mayer,Sutter和其他人使用我所描述的术语.我还没有找到[推荐书籍](/sf/ask/27176971/)列表中没有的作者. (3认同)
  • 从名称中可以明显看出,C兼容头包含C++标准库的"C标准库"组件的接口,而Boost的部件似乎没有自己的子组名称(据我所知) ,至少),但大多数教程和其他网站没有解释"STL"特别是基于原始STL的C++标准库的一部分,当他们使用术语STL时会导致很多混淆(因为,没有解释,它只是看起来像_STandard Library_的缩写. (3认同)
  • @mrjoltcola'Bjarne Stroustrup在"佳能"中明确区分STL与标准库的其他部分 - Stroustrup是某个教授的某个地方,我想这个职业有义务承认他人的使用'工作,即将STL纳入C++标准.据称他删除了一半的内容,以便保守的标准委员会可以接受. (2认同)
  • 每个着名作者和"C++"上的每一个重要文本都只将标准库中的*容器*和*算法*部分称为"STL",它赋予了使用适当的合法性.原因是"STL"及其哲学是革命性的,需要在计算机科学和教育方面作为一个整体来提及.标准库的其他部分没有被正确地称为"STL",当然我们的工作应该是纠正人而不是增加混乱? (2认同)
  • @Galik:纠正人们是我正在尝试做的事情。混合术语会让人们感到困惑。 (2认同)
  • @JohannesSchaub-litb:是的,不幸的是,“只有一个托马拉克”这句话实际上并不正确 (2认同)

Jer*_*fin 81

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

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

之后这些作品被添加到标准库,标准库的其他一些地方进行了修改,以适应加入什么更好的(例如begin,end,rbeginrend加入std::string,以便它可以像一个容器中使用).大约在同一时间,大多数库(甚至是完全不相关的片段被制作成模板以适应不同类型(例如,标准流)).

有些人还使用STL作为"STandard Library"的简称.

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

不幸的是,混乱可能会继续有增无减.引用"STL"比"C++标准库中的容器,迭代器和算法"更方便,但不包括std::string,即使它可以像容器一样.尽管"C++标准库"不是那么长而且笨拙,但"STL"仍然更短更简单.除非有人发明更精确的术语(必要时),并且同样方便,否则将继续使用"STL"并继续产生混淆.

  • @Jerry:不确定命名空间的位置.兼容的实现不会向命名空间`std`添加任何内容.我在谈论"stdlib"中的"std",它代表"标准".我觉得很清楚这意味着什么! (6认同)
  • @Jerry:前者; 这就是"std"的意思.:) (5认同)
  • @Jerry:我真的不认为期待有人将形容词"标准"读作"这是标准的"是一种延伸.同时,17.4.3.1/1很清楚,除了某些特定的命名情况外,在命名空间`std`中添加内容是UB:这些添加的情况在标准中命名,因此仍然完全符合; "标准"仍然适用. (3认同)
  • SGI和HP的历史是倒退的。斯捷潘诺夫在加入 SGI 之前曾在惠普工作。 (2认同)
  • 我只是重读了这里的评论,并认为值得添加一个(不可否认的次要)点:我认为期望"标准"总是意味着"这是标准的"有点延伸.特别是,许多C++程序员在*标准之前很久就使用了"标准库"这个短语.为了避免有人认为他们指的是C标准中的库,我会指出,在C标准(甚至是草案)之前,C程序员也是如此. (2认同)

In *_*ico 49

术语"STL"或"标准模板库"不会出现在ISO 14882 C++标准的任何地方.所以将C++标准库称为STL是错误的.术语"C++标准库"或"标准库"是ISO 14882正式使用的:

ISO 14882 C++标准:

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

  1. 这个子句描述了C++标准库的内容,一个结构良好的C++程序如何使用该库,以及一致的实现如何提供库中的实体.

...

STL是一个最初由Alexander Stepanov设计的库,独立于C++标准.然而,C++标准库的一些组分包括STL部件等vector,list以及类似的算法copyswap.

但是当然C++标准包含了更多STL以外的东西,因此术语"C++标准库"更为正确(并且是标准文档实际使用的内容).

  • +1.虽然在STL中没有`std`命名空间(IIRC). (5认同)
  • @Kragen:嗯,没有标准. (3认同)
  • 哦.好吧,Stroustrup有一些书,但我想这不是一回事,是吗? (3认同)
  • 当时,大多数 C++ 编译器都没有实现命名空间。事实上,我不知道它们是否符合标准。 (2认同)

Mar*_*som 22

我最近提出了同样的论点,但我相信可以允许一点宽容.如果斯科特迈耶斯犯了同样的错误,你就会很好.

  • 您还将加入Bjarne Stroustrup公司 - 参考.例如.http://www.stroustrup.com/DnE2005.pdf:"STL("标准模板库";即ISO C++标准库的容器和算法框架)" (11认同)
  • @Tomalak,我也不会以这种方式使用"STL",虽然我过去可能已经犯了它.我只是觉得值得打败人们. (6认同)
  • @Tomalak & @Mark:实际上斯科特没有,我的“-1”。这本书确实是关于 STL 的,意思是“std lib 的部分源于 Stepanov 的库”。花时间浏览书籍目录。我能找到的原始 STL 之外的唯一东西是“std::string”,并且它已被配备为一个成熟的 STL 容器。 (3认同)
  • 我可以尊重。我对那些根本拒绝承认潜在的歧义的人感到最无礼。:) (2认同)

vst*_*iuk 8

来自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/ 也不见了。