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

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

(...)它指的是“ STL”,尽管实际上仍然不多有人使用STL(它是SGI设计的)。 c++

C ++标准库的某些部分是基于STL的,所以不少人(包括数位做者和臭名昭著的cplusplus.com)仍然将这些部分称为“ STL”。 可是,这是不许确的。 实际上,C ++标准从不说起“ STL”,而且二者之间存在内容差别。 程序员

(...)不多使用“ STL”来指代stdlib中刚好基于SGI STL的位。 人们认为这是整个标准库。 它被放在简历上。 这是一种误导。 web

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


#1楼

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


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

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

特别地, string不是来自SGI,而且不使用其“ rope”类(尽管做为可选扩展包含在内), valarray也不是其余一些。 像vector<>这样的类来自SGI,但已进行了大量修改。 spa

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

仍建议阅读有关SGI STL的FAQ


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


#2楼

术语“ 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和算法(例如copyswap

可是,固然,C ++标准在STL以外包含更多内容,所以术语“ C ++标准库”更正确(这是标准文档实际使用的内容)。


#3楼

“ 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 ++标准库的人的完美 示例 。 令我感到困惑的是,有如此多的人发誓盲目,而几乎天天均可以看到的状况下,没人能作到这一点。


#4楼

我最近也提出了一样的论点,但我相信能够容许一些宽容。 若是斯科特·迈耶斯(Scott Meyers)犯了一样的错误,则说明您的公司很好。


#5楼

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

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

以后这些做品被添加到标准库,标准库的其余一些地方进行了修改,以适应加入什么更好的(例如, beginendrbeginrend加入std::string ,所以它能够像使用容器)。 大约在同一时间, 大多数库(甚至是彻底不相关的部分)被制成模板以容纳不一样类型(例如标准流)。

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

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

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

相关文章
相关标签/搜索