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

左心房为你撑大大i 提交于 2020-02-28 03:31:24

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

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

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

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

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


#1楼

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的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”,并且会继续造成混淆。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!