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

时间:2011-03-05 17:32:14

标签: c++ stl std c++-standard-library c++-faq

有人提请我this article声称​​(我正在解释) STL术语被误用于引用整个C ++标准库而不是从SGI获取的部分STL。

  

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

     

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

     

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

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

7 个答案:

答案 0 :(得分:530)

在C ++标准化之前很久的“STL”was written by Alexander Stepanov。 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才是其中之一(甚至在那里,the confusion还有很多!)。

此外,C ++标准在任何地方都不包含文本“STL”,并且有些人习惯性地使用诸如“在C ++标准库中包含 的STL”之类的短语,这是明显不正确的。

我相信继续以这种方式宣传这个词的用法只会导致误解永远存在。唉,尝试改变事物可能完全适得其反,即使它应该变得更好。我们可能会永远陷入双重含义。

<强>结论

我很欣赏这篇文章有点偏颇:我写了你链接的文章。 :)无论如何,我希望这有助于更好地解释这场战斗。

更新13/04/2011

以下是使用“STL”来引用整个C ++标准库的人three perfect examples。它让我感到困惑的是,很多人发誓失明,没有人会这样做,而且几乎每天都能看到它。

答案 1 :(得分:81)

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

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

在将这些部分添加到标准库之后,修改了标准库的其他部分以更好地适应添加的内容(例如beginendrbeginrend已添加到std::string,因此可以像容器一样使用它。大约在同一时间,大多数的库(甚至完全无关的部分)被制作成模板以适应不同类型(例如,标准流)。

有些人还使用STL作为“STandard Library”的简称。

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

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

答案 2 :(得分:47)

术语“STL”或“标准模板库”未出现在ISO 14882 C ++标准中的任何位置。所以将C ++标准库称为STL是错误的。术语“C ++标准库”或“标准库”是ISO 14882正式使用的:

  

ISO 14882 C ++标准:

     

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

     
      
  1. 此条款描述了 C ++标准库 的内容,   一个结构良好的C ++程序可以使用   图书馆,以及如何符合   实施可能会提供   图书馆中的实体。
  2.         

    ...

STL是一个最初由Alexander Stepanov设计的库,独立于C ++标准。但是,C ++标准库的某些组件包括vectorlist等STL组件以及copyswap等算法。

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

答案 3 :(得分:22)

我最近提出了同样的论点,但我相信可以允许一点宽容。如果Scott Meyers犯了同样的错误,那么你就是好伙伴。

答案 4 :(得分:1)

来自GNU Standard C++ Library (libstdc++) FAQ

STL(标准模板库)是C ++标准库大块的灵感来源,但这些术语不可互换,并不代表同样的东西。 C ++标准库包含许多不是来自STL的东西,其中一些甚至不是模板,例如baseClassstd::locale

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

特别是,std::thread不是来自SGI而且没有使用他们的“绳子”类(尽管它包含在可选的扩展名中),string和其他一些都没有。像valarray这样的类来自SGI,但已被广泛修改。

有关libstdc ++演变的更多信息,请参阅API evolutionbackwards compatibility文档。

仍然建议阅读SGI STL的FAQ

仅供参考,截至2018年3月,甚至是官方STL网站www.sgi.com/tech/stl/ is gone

答案 5 :(得分:0)

C ++标准库包括 C ++ STL

C ++标准库的内容为:

  1. C语言版本的C语言头文件
  2. C ++ IO头文件
  3. C ++ STL

因此,请不要将C ++标准库与STL混淆。

答案 6 :(得分:0)

用通俗易懂的话说:STL是标准库的一部分。

C ++标准库分为:

  1. 标准功能库 -I / O, -字符串和字符处理, -数学的 -时间,日期和本地化, -动态分配, -杂, -宽字符功能

  2. 标准OOP和泛型库 -标准C ++ I / O类 -弦乐类 -数字类 -STL容器类 -STL算法 -STL函数对象 -STL迭代器 -STL分配器 -本地化库 异常处理类 -其他支持库

因此,如果您将STL称为标准库,那就可以了,请记住,STL实现允许泛型,而其他实现更特定于一种类型。

请参阅https://www.tutorialspoint.com/cplusplus/cpp_standard_library.htm