【问题标题】:What's the difference between "STL" and "C++ Standard Library"?“STL”和“C++ 标准库”有什么区别?
【发布时间】:2011-07-09 11:53:32
【问题描述】:

有人提请我注意 this article,声称 (我在解释) STL 术语被滥用来指代整个 C++ 标准库,而不是取自 SGI STL 的部分。

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

C++ 标准库的部分内容是基于 STL 的部分内容,许多人(包括几位作者和臭名昭著的错误缠身的 cplusplus.com)仍然将这些部分称为“STL”。但是,这是不准确的;确实,C++标准从来没有提到过“STL”,两者在内容上有区别。

(...) "STL" 很少用于表示恰好基于 SGI STL 的 stdlib 位。人们认为它是整个标准库。它被放在简历上。并且具有误导性。

我对 C++ 的历史几乎一无所知,所以我无法判断这篇文章的正确性。我应该避免使用术语 STL 吗?还是这是一个孤立的观点?

【问题讨论】:

  • 人们需要好名字来描述事物。 Stepanov 的天才改变了我们的编程方式。像“标准库编程”这样的名字完全没有用。称之为“stl 编程”,每个人 都知道你的意思。争论这一点没有抓住重点:我们需要一个好名字。
  • @Hans:不,没有抓住重点:“每个人都知道你的意思”是不正确
  • 我不明白你的意思。
  • Here 是使用“STL”来引用整个 C++ 标准库的完美示例。让我感到困惑的是,有这么多人发誓从来没有人这样做过,而几乎每天都能看到。

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


【解决方案1】:

在 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++ 标准库”(或标准库)

但是,还有另一种思想流派——我赞同它——说这很令人困惑。第一次学习 C++ 的人知道这种区别,并且可能不会注意到细微的语言差异。

那篇文章的作者曾多次遇到有人认为整个 C++ 标准库 STL,包括从未属于 STL 本身的功能。相比之下,大多数“STL”的直言不讳的支持者确切地知道他们所说的意思,并且拒绝相信不是每个人都“明白”。显然,该术语的用法并不统一。

此外,还有一些类似 STL 的库实际上是原始 STL 的实现,而不是 C++ 标准库。直到最近,STLPort 还是其中之一(甚至在那里,the confusion 比比皆是!)。

此外,C++ 标准在任何地方都没有包含文本“STL”,有些人习惯性地使用“STL 包含在 C++ 标准库中”这样的短语,这是完全不正确的。

我认为,继续以这种方式宣传该术语的使用只会导致永远存在的误解。唉,试图改变事情可能完全适得其反,即使它应该是更好的。我们可能永远被双重含义所困。

结论

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

2011 年 13 月 4 日更新

这里是 three perfect examples 使用“STL”来引用整个 C++ 标准库的人。一直让我感到困惑的是,有这么多人发誓从来没有人这样做过,而几乎每天都能看到。

【讨论】:

  • Standard Template L图书馆不仅由 Stepanov 创建和 Lee,但他们当时也在 Software Ttechnology Laboratory 工作。
  • 今天有人问std::iota 在什么标题中,因为他无法让它工作。 It's an SGI non-standard extension,他们在适合他们的时候称之为“标准”,因为它是“STL”,每个人都知道“STL”是 C++ 标准库的一部分,对吧?它是在 C++0x 中引入的,但在 C++03 中不可用。咕噜。
  • MS STL 由 Stephan T 维护。 Lavavej,又名 STL。
  • Bjarne Stroustrup 在 C++ 编程语言第 4 版“canon”中明确区分了 STL 与标准库的其他部分。
【解决方案2】:

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

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

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

有些人还将 STL 用作“标准库”的简称。

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

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

【讨论】:

  • @Jerry:前者;这就是“std”的含义。 :)
  • @Jerry:不确定命名空间的来源。兼容的实现不会向命名空间std 添加任何内容。我说的是“stdlib”中的“std”,它代表“标准”。我认为这意味着什么很清楚!
  • @Jerry:我真的不认为期望有人将形容词“标准”解读为“这是标准中的”。同时,17.4.3.1/1 非常清楚,向命名空间std 添加东西是UB,除了在一些特定的命名情况下:这些添加情况在标准中命名,因此仍然完全符合; “标准”仍然适用。
  • 这里的 SGI 和 HP 的历史是倒退的。 Stepanov 在加入 SGI 之前曾在惠普工作。
  • 我刚刚重读了这里的 cmets,并认为值得再添加一个(当然是次要的)点:我认为期望“标准”总是意味着“这是在标准”。特别是,许多 C++ 程序员早在 标准出现之前就使用了“标准库”这个短语。以免有人认为他们指的是 C 标准中的库,我要指出,早在 C 标准(甚至是草案)出现之前,C 程序员也是如此。
【解决方案3】:

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

ISO 14882 C++ 标准:

17 - 库介绍[lib.library]:

  1. 本条款描述 C++ 标准库的内容,如何 一个格式良好的 C++ 程序利用 图书馆,以及如何符合 实施可以提供 库中的实体。

...

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

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

【讨论】:

  • +1。虽然,在 STL 中,没有 std 命名空间 (IIRC)。
  • 当时,大多数 C++ 编译器都没有实现命名空间。事实上,我什至不知道他们是否在标准中。
  • @Kragen:嗯,没有标准。
  • 哦。好吧,有一些 Stroustrup 的书,但我想那不完全一样,是吗?
【解决方案4】:

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

【讨论】:

  • @Tomalak & @Mark:其实 Scott 没有,-1 来自我。这本书确实是关于 STL 的,意思是“来自 Stepanov 库的 std 库的部分”。花点时间翻阅书籍目录。在原始 STL 之外,我唯一能找到的东西是 std::string,它已经被装备成一个成熟的 STL 容器。
  • @sbi:你显然误解了我的立场。我不会像 Scott 那样使用“STL”。请阅读我的回答。
  • @Tomalak,我也不会以这种方式使用“STL”,尽管我过去可能对此感到内疚。我只是觉得打人不值得。
  • 我可以尊重。对于那些根本拒绝承认潜在歧义的人,我最讨厌。 :)
  • 你也会在 Bjarne Stroustrup 的陪伴下 - 参考。例如。 stroustrup.com/DnE2005.pdf : "STL(“标准模板库”;即 ISO C++ 标准库的容器和算法框架)"
【解决方案5】:

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


STL(标准模板库)是大量 C++ 标准库的灵感来源,但这些术语不可互换,它们的含义也不相同。 C++ 标准库包含许多并非来自 STL 的东西,其中一些甚至不是模板,例如 std::localestd::thread

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

特别是,string 不是来自 SGI,并且没有使用它们的“绳索”类(尽管它作为可选扩展包含在内),valarray 和其他一些也不是。 vector<> 之类的类来自 SGI,但经过大量修改。

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

SGI 的 STL 的FAQ 仍然推荐阅读。


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

【讨论】:

    【解决方案6】:

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

    C++标准库的内容是:

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

    所以请不要将 C++ 标准库与 STL 混淆。

    【讨论】:

    • 虽然 STL 的 部分 确实被合并到 C++98 标准库中,但 STL、IOStream 和 C-stuff 并不是只有标准库中的东西。甚至是 C++98 标准库。
    【解决方案7】:

    通俗地说: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

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 2011-05-03
      • 2011-01-31
      • 2015-02-12
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      相关资源
      最近更新 更多