首页 文章

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

提问于
浏览
388

有人提请我注意,我声称STL术语被用来引用整个C标准库,而不是从SGI STL中获取的部分 .

(...)它指的是“STL”,尽管很少有人仍然使用STL(在SGI设计) . C标准库的部分内容基于STL的部分内容,许多人(包括几位作者和臭名昭着的错误cplusplus.com)仍然将这些部分称为“STL” . 但是,这是不准确的;事实上,C标准从未提及“STL”,两者之间存在内容差异 . (...)“STL”很少用于指代恰好基于SGI STL的stdlib的位 . 人们认为这是整个标准库 . 它被放在简历上 . 这是误导 .

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

5 回答

  • 508

    在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”,和/或它是否重要 .

    For "STL"

    有一种思想流派说现在每个人都知道“STL”意味着标准库,就像现在每个人都知道“C”是ISO标准化语言一样 .

    它还包括那些认为只要所有各方理解所谈论内容并不重要的人 .

    这个术语因野兽的性质而变得更加普遍,其中大部分都大量使用被称为“模板”的C特征 .

    For "C++ Standard Library" (or stdlib)

    然而,还有另一种思想流派 - 我订阅了 - 这说明这令人困惑 . 第一次学习C的人不知道这种区别,也可能没有注意到语言的差异 .

    该文章的作者曾多次遇到过相信整个C标准库是STL的人,包括从未成为STL本身一部分的功能 . 相比之下,"the STL"的大多数声音支持者确切地知道它们的含义,并且拒绝相信并非所有人"gets it" . 显然,该术语的用法并不统一 .

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

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

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

    Conclusion

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

    Update 13/04/2011

    这是three perfect examples正在使用"the STL"来引用整个C标准库的人 . 它让我感到困惑的是,很多人发誓盲目,没有人会这样做,而且几乎每天都能看到这一点 .

  • 79

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

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

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

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

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

    不幸的是,混乱可能会继续有增无减 . 引用"STL"比“C标准库中的容器,迭代器和算法”更方便,但不包括 std::string ,即使它可以像容器一样." Even though " C标准库" isn't quite as long and clumsy as that, " STL“仍然很多更短更简单 . 直到或除非有人发明更精确的术语(必要时), and 同样方便,将继续使用"STL"并继续产生混淆 .

  • 45

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

    ISO 14882 C标准:17 - 库介绍[lib.library]:这个子句描述了C标准库的内容,一个格式良好的C程序如何使用该库,以及一致的实现如何提供实体图书馆 . ...

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

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

  • 1

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

  • 22

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


    STL(标准模板库)是C标准库大块的灵感,但这些术语不可互换,并且它们不是来自STL,有些甚至不是模板,例如 std::localestd::thread .

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

    特别是, string 不是来自SGI并且不使用它们的"rope"类(尽管它包含在可选扩展名中), valarray 和其他一些都没有 . 像 vector<> 这样的类来自SGI,但已被广泛修改 .

    有关libstdc演变的更多信息,请参见API evolutionbackwards compatibility文档 .

    仍然建议阅读SGI STL的FAQ .


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

相关问题