C++标准容器和c++中的STL容器

C++ standard container and STL container in c++

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

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

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

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

C++ 标准库中的任何内容 "belongs" 到 STL。 STL 是一个不同的库,仅 影响了 C++ 标准库中的许多部分。来自标签维基:

[STL] is a C++ library of generic containers, iterators, algorithms, and function objects. When C++ was standardised, large parts of the STL were adopted into the Standard Library, […]

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

有关详细信息,请参阅 What's the difference between "STL" and "C++ Standard Library"?

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

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

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

正如 this answer, Bjarne Stroustrup, the inventor of C++, described STL 中的评论所指出的那样

the STL (the "Standard Template Library"; that is, the containers and algorithm framework of the ISO C++ standard library)

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

标准库中引入的其他重要 STL 功能包括函数式编程的新范式,体现在现在 <algorithm> 和其他任何地方,在我看来,它通过补充传统的 Object 语言使 C++ 重新焕发活力面向编程范式。

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

在 90 年代初期,C++ 中没有 collection 库。人们要么使用 RogueWave、Booch 组件,要么使用其他我忘了名字的东西。这就是为什么您会在 QT 中看到 class 类似 QList 的原因,因为它们需要一些东西。

当时,SGI 有一个 collection 库,标准委员会的许多人都看过并且非常喜欢。他们基于许多人请求的 collection 库,并将其称为 STL。

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

之类的类型定义

至于效率,STL 非常精简和平均,这要感谢在专业化和 TMP 等方面精通的作者。我可以写一些更适合我的目的的东西吗?我可以花一个月的时间写一些能满足我的需求 1% 的东西,但这值得吗?

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

(1) 顺便说一句,我认为 STL 方法是最好的方法。其他 collections 要求你做一些事情,比如从基础 class 收藏品或类似的东西中派生。

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