【问题标题】:C++ standard container and STL container in c++c++中的C++标准容器和STL容器
【发布时间】:2015-07-29 05:15:39
【问题描述】:

最近我在做一个不允许使用标准模板库或任何其他模板的 c++ 项目。

我做了一些研究后有点困惑。哪些容器属于标准库而其他容器属于标准模板库?或者我们不说标准库的容器,对吗?

vector 是不是容器? vector是标准库的类还是属于STL?

我希望在标准库中实现一些结构的列表,我可以使用列表或向量吗?

【问题讨论】:

  • 据我所知,过去被称为 STL 的是 C++ 标准库的一部分。不再有 STL 容器。它们只是 C++ 标准库的一部分。
  • 谢谢 R 萨胡。我在想有时我们不使用 STL 的原因是它需要更多的内存。就像我们使用map一样,每个item的内存都是连续的。所以我想知道当人们说不要使用 STL 时,这意味着使用一些可以节省内存的类/结构/容器。
  • 当然,使用标准库的某些部分是否有意义取决于项目,并且确实有一些您不想使用它们的情况。但我有一种感觉,有时这是最糟糕的过早优化形式之一。
  • 哎呀,不被允许使用string真是太糟糕了。或cout,就此而言。我怀疑你提到的制定规则的人并没有真正考虑清楚。您应该反击并询问规则的目的是什么,而不是盲目地接受它们作为教条。
  • 谢谢。我在面试时遇到了这个问题。我认为他们希望候选人可以使用指针和类来实现自己的数据结构,而不是使用 STL 中的容器。

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


【解决方案1】:

C++ 标准库中的任何内容“属于” 属于 STL。 STL 是一个不同的库,它仅影响 C++ 标准库中的许多部分。来自标签维基:

[STL] 是一个包含通用容器、迭代器、算法、 和功能对象。 当 C++ 标准化时,大部分 STL 被纳入标准库,[…]

但是,很多人将 C++ 标准库称为标准模板库,这并不完全正确。我猜如果不允许您使用 STL,它们实际上意味着您不允许使用 C++ 标准库。但是你必须让他们知道他们真正的意思。

欲了解更多信息,请参阅What's the difference between "STL" and "C++ Standard Library"?

【讨论】:

    【解决方案2】:

    在我看来,STL和c++标准库的区别有点类似于LinuxGNU/Linux的关系:

    从历史上看,STL 是核心(包括容器、算法和迭代器等),而标准库是一个围绕核心构建的完整操作系统,提供其他一切。标准库在 STL 之上进行了修改,但标准库的那部分根植于 STL。 (还记得 GNU 人多么努力地提醒我们 Linux 只是一个内核,并坚持将操作系统称为 GNU/Linux 吗?)

    如果标准委员会正在撰写论文而不是 c++ 标准,他们可能需要在重叠域中的任何地方都承认 STL,而不是声称存在差异。

    正如this answer 中的 cmets 所指出的,C++ 的发明者 Bjarne Stroustrup,described STL

    STL(“标准模板库”;即容器和 ISO C++标准库的算法框架)

    更重要的是,标准库中引入的 STL 的一个核心特性是 每个 STL 算法必须具有预先指定的最坏情况算法复杂度的概念,使得谁实现 STL 成为不重要的事情。只需注意 STL 容器或算法的规范,这些容器或算法历史上托管在 SGI 网站以及其他来源上。这在史前时代是相当重要的,那时每个人都可以想出具有不同计算复杂性的自己的容器。

    标准库中引入的其他重要的 STL 特性包括函数式编程的新范式,如现在的 <algorithm> 和其他地方所体现的那样,在我看来,通过补充传统的面向对象编程范式,它使 C++ 作为一种语言重新焕发生机。

    从这个意义上说,回到你的问题,我认为像vector 这样的容器属于STL(最初)标准库是公平的。

    【讨论】:

    • 不——STL 不是核心。这是一个较晚的添加,将第一个标准推迟了大约 2 年(1996->1998)。此外,标准必须准确记录 STL 组件应该如何工作,以允许替代实现。
    • STL 推倒标准?这是一种奇怪的看待它的方式。如果 STL 容器、算法和算法复杂性的相关规范不是核心材料,为什么标准化要花费大约 100 万美元。两年能合并吗?另外,这两年是花更多的时间来改进 STL 还是在协商 STL 中的新特性是否对 c++ 来说太多了?
    • STL 带有复杂性规范,并在被纳入标准之前有替代实现。
    【解决方案3】:

    在 90 年代初期,C++ 中还没有集合库。人们要么使用 RogueWave、Booch 组件,要么使用其他我忘记名字的东西。这就是为什么你会在 QT 中看到像 QList 这样的类,因为它们需要一些东西。

    当时,SGI 有一个收藏库,标准委员会的许多人都看到并非常喜欢。他们基于很多人都在请求的集合库并将其称为 STL。

    到目前为止,我会说用户已明确实例化它的库组件是 STL 的一部分。为了澄清,您作为 std::vector 的用户必须指定它包含的内容,即 std::vector (1) 这意味着它是 STL 的一部分。 OTOH,您不必实例化 fstream,即使它是 basic_fstream 之类的 typedef。

    至于效率,STL 非常精简和刻薄,这要归功于专业化和 TMP 等方面的专家。我可以写一些更适合我的目的的东西吗?我可能需要一个月的时间来写一些对我的需求来说效果好 1% 的东西,但这值得吗?

    顺便说一句,除了操作系统调用和 C 调用之外,整个 C++ 库都是模板化的,尽管(如 fstream )你可能永远看不到它。所以他们禁止了大部分 C++ 库。

    (1) 顺便说一句,我认为 STL 方法是最好的方法。其他集合要求您执行诸如从基类 Collectible 派生之类的操作。

    【讨论】:

    • Stepanov 和 Lee 在开发 STL 时在惠普。 Source
    【解决方案4】:

    感谢您对我的问题的所有回复。自己对这个问题的一些理解: 1.当你需要在没有STL或任何其他模板库的情况下进行开发时,你只能使用像,,这样的库。程序中只能使用指针、字符串(可能只有字符)和类,这意味着您需要定义自己的数据结构。 2.不使用STL的目的是为了测试你对C++基本操作的理解,比如new/delete、pointer、class。我想的另一个目的是节省内存。 我在面试时遇到了这个问题。如果您面临与我之前遇到的相同的情况,我希望它会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多