“STL”和“C ++标准库”有什么区别?
有人把这篇文章引起了我的注意,声称(我是释义) STL术语被滥用来引用整个C ++标准库,而不是从SGI STL获取的部分。
(…)它是指“STL”,尽pipe事实上很less有人仍然使用STL(这是在SGIdevise的)。
C ++标准库的一部分是基于STL的一部分,这些部分是很多人(包括几个作者和臭名昭着的cplusplus.com)仍然被称为“STL”。 但是,这是不准确的。 事实上,C ++标准从来没有提到“STL”,两者之间有内容差异。
(…)“STL”很less用于引用恰好基于SGI STL的stdlib的位。 人们认为这是整个标准库。 它被放在简历上。 这是误导。
我对C ++的历史几乎一无所知,所以我不能判断文章的正确性。 我是否应该避免使用术语STL? 或者这是一个孤立的意见?
“STL” 是由Alexander Stepanov在C ++标准化之前的很长一段时间里写的 。 C ++在80年代就已经存在,但我们现在称之为“ C ++ ”的是在ISO / IEC 14882:2014(和早期版本,如ISO / IEC 14882:2011)中标准化的语言。
STL已被广泛用作C ++的库,使程序员可以访问容器,迭代器和algorithm。 当标准化发生时,语言委员会devise了C ++标准库的一部分(这是语言标准的一部分),与STL 非常匹配。
多年来,许多人 – 包括着名的书籍作者和各种网站 – 继续将C ++标准库称为“STL”,尽pipe这两个实体是分开的,并且存在一些差异。 这些差异在即将出现的新的C ++标准中更为明显,其中包括各种特征并显着改变了某些类别。
原来的STL现在通常被称为“C ++标准模板库的实现”(而不是后面的实际历史!),就像您的Microsoft Visual Studio或GCC提供了C ++标准库的实现一样。 但是“标准模板库”和“标准库”不是一回事。
争夺战是关于现在的标准库应该被全部还是部分地称为“STL”,或者说它是否重要。
对于“STL”
现在大家都知道“STL”就是标准库,现在大家都知道“C ++”是ISO标准化的语言了。
还包括那些相信只要各方都明白所谈论的内容都不重要的人 。
这是一个更为stream行的术语,其中大部分是大量使用被称为“模板”的C ++特性。
对于“C ++标准库”(或stdlib)
然而,还有另外一种思想 – 我赞成 – 认为这是令人困惑的。 第一次学习C ++的人不知道这个区别,可能不会注意到小的语言差异。
那篇文章的作者曾多次遇到过相信整个C ++标准库是 STL的人,包括那些从来不属于STL本身的特性。 大多数“STL”的声音支持者,相反,确切地知道他们的意思,并拒绝相信不是每个人都“得到它”。 显然,这个词的用法是不统一的。
此外,还有一些STL类库实际上是原始STL的实现,而不是C ++标准库。 直到最近, STLPort才是其中的一员(甚至在那里, 这个混乱也不less!)。
此外,C ++标准在任何地方都不包含文本“STL”,有些人习惯性地使用“STL 包含在C ++标准库”这样的短语,这是明显错误的。
我相信,继续以这种方式宣传这个词的用法,只会导致误解持续下去。 唉,试图改变的东西可能完全是相反的,即使它应该是更好的。 我们可能永远只是被双重含义所束缚。
结论
我很欣赏这个post有点偏颇:我写了你链接的文章。 :)无论如何,我希望这有助于解释战斗更好一点。
更新13/04/2011
这里有三个使用“STL”来引用整个C ++标准库的完美 例子 。 它仍然让我感到困惑,许多人盲目瞎编,以至于几乎每天都看不到这种事。
没有一个答案是非常正确的。 亚历山大·斯捷潘诺夫(Alexander Stepanov)开发了一个名为STL(当时为惠普工作)的图书馆。 那个库被提议包含在C ++标准中。
这基本上“分叉”了发展。 委员会包括一些部分,完全拒绝其他人,并重新devise了几个(与亚历山大的参与)。 原始图书馆的开发后来转移到了Silicon Graphics,但是与C ++标准库分开。
在这些部分被添加到标准库之后,标准库的一些其他部分被修改以更好地适应所添加的内容(例如,将begin
, end
, rbegin
和rend
添加到std::string
以便可以像使用容器)。 大约在同一时间, 大部分图书馆(甚至是完全不相关的图书馆)都被制作成模板以适应不同的types(例如标准stream)。
有些人也使用STL作为“标准库”的简称。
这意味着当有人使用术语“STL”时,他们可能指的是大约六十种不同的东西中的任何一种。 无论好坏,大多数使用它的人似乎忽略了多重意义,并假设其他人都会认识到他们所指的是什么。 这导致了许多误解,至less有一些严重的火焰战争,使大多数参与者看起来很愚蠢,因为他们只是在谈论完全不同的事情。
不幸的是,这种混乱可能会持续下去。 引用“STL”比C ++标准库中的容器,迭代器和algorithm更方便,但不包括std::string
,尽pipe它可以像容器一样工作。 尽pipe“C ++标准库”并不那么长和笨拙,但“STL”仍然更短,更简单。 直到或除非有人发明更精确的术语(如有必要),同样方便,“STL”将继续使用,并继续产生混淆。
术语“STL”或“标准模板库”不会在ISO 14882 C ++标准中的任何地方出现。 所以把C ++标准库称为STL是错误的。 术语“C ++标准库”或“标准库”是ISO 14882正式使用的术语:
ISO 14882 C ++标准:
17 – 图书馆介绍[lib.library]:
- 本章节描述了C ++标准库的内容,一个格式良好的C ++程序如何使用这个库,以及一个相符的实现如何提供库中的实体。
…
STL是最初由Alexander Stepanovdevise的独立于C ++标准的库。 但是,C ++标准库的一些组件包括像vector
, list
和copy
和swap
等algorithm的STL组件。
但是,当然C ++标准包含了STL以外的更多的东西,所以术语“C ++标准库”更加正确(标准文档实际使用的是C ++标准库)。
我最近也提出过这个观点,但我相信有一点宽容是可以允许的。 如果斯科特·迈耶斯(Scott Meyers)犯了同样的错误,那么你就是个好公司