c++标准容器和c++ STL容器

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

本文关键字:c++ STL 容器 标准      更新时间:2023-10-16

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

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

vector是否为容器?向量是一个类的标准库或它属于STL?

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

c++标准库中没有 "属于" STL。STL是一个不同的库,只有影响了c++标准库中的许多部分。来自标签wiki:

[STL]是一个泛型容器、迭代器、算法、函数对象。当c++被标准化时,大部分的STL被纳入标准库,[…]

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

更多信息,请参见"STL"和c++标准库"?

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

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

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

正如在这个回答的评论中所指出的,c++的发明者Bjarne Stroustrup将STL描述为

STL("标准模板库";也就是容器和ISO c++标准库的算法框架)

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

标准库中引入的其他重要STL特性包括函数式编程的新范式,体现在当前的<algorithm>和其他地方,在我看来,通过补充传统的面向对象编程范式,它使c++作为一门语言重新焕发了活力。

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

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

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

到目前为止,我会说用户显式实例化的库组件是STL的一部分。为了澄清,std::vector的用户必须指定它包含的内容,即std::vector(1)。这意味着它是STL的一部分。你不需要实例化fstream,即使它是一个类似basic_fstream的类型定义。

至于效率,STL是非常精简和吝啬的,这要感谢那些在专门化和TMP等方面是专家的作者。我能写一些更符合我目的的东西吗?我可以花一个月的时间写一些比我的需求好1%的东西,但这值得吗?

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

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

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