繁体   English   中英

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

[英]What's the difference between "STL" and "C++ Standard Library"?

有人让我注意到这篇文章声称(我正在解释) STL 术语被误用于指代整个 C++ 标准库,而不是取自 SGI STL 的部分。

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

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

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

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

在 C++ 标准化之前很久,“STL” 是由 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还是其中之一(即使在那里,混乱也比比皆是!)。

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

我相信,继续以这种方式传播该术语的用法只会导致误解永远持续下去。 唉,试图改变事情可能完全适得其反,即使它应该变得更好。 我们可能会永远陷入双重含义。

结论

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

2011 年 4 月 13 日更新

以下是使用“STL”来引用整个 C++ 标准库的人的三个完美示例 令我感到困惑的是,这么多人发誓说没有人这样做过,因为几乎每天都可以看到。

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

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

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

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

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

不幸的是,混乱可能会继续有增无减。 引用“STL”比“C++ 标准库中的容器、迭代器和算法,但不包括std::string之类的东西要方便得多,即使它可以充当容器”。 尽管“C++ 标准库”没有那么长和笨拙,但“STL”仍然更短、更简单。 直到或除非有人发明了更精确(必要时)同样方便的术语,“STL”将继续使用,并且将继续导致混淆。

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

ISO 14882 C++ 标准:

17 - 库介绍[lib.library]:

  1. 本节描述了C++ 标准库的内容,格式良好的 C++ 程序如何使用库,以及符合要求的实现如何提供库中的实体。

...

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

但是当然 C++ 标准包括 STL 之外的更多东西,所以术语“C++ 标准库”更正确(并且是标准文档实际使用的)。

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

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


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

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

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

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

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


仅供参考,截至 2018 年 3 月,甚至 STL 官方网站www.sgi.com/tech/stl/也不见了。

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

C++标准库的内容是:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM