c++标准容器和c++ STL容器
C++ standard container and STL container in c++
最近我正在做一个c++项目,我不允许使用标准模板库或任何其他模板。
在我做了一些研究之后,我有点困惑。哪些容器属于标准库,而其他容器属于标准模板库?或者我们没有说标准库的容器,对吧?
vector是否为容器?向量是一个类的标准库或它属于STL?
我希望在标准库中实现一些结构的列表,我可以使用列表或向量吗?
c++标准库中没有 "属于" STL。STL是一个不同的库,只有影响了c++标准库中的许多部分。来自标签wiki:
[STL]是一个泛型容器、迭代器、算法、函数对象。当c++被标准化时,大部分的STL被纳入标准库,[…]
然而,许多人把c++标准库称为标准模板库,这并不完全正确。我猜如果你不被允许使用STL,他们实际上意味着你不被允许使用c++标准库。但你必须问他们知道他们真正的意思。
更多信息,请参见"STL"和c++标准库"?
在我看来,STL
和c++标准库之间的区别有点类似于Linux
和GNU/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++操作的理解,比如新建/删除、指针和类。我想的另一个目的是节省内存。我在一次面试中遇到了这个问题。如果你遇到和我一样的情况,我希望这篇文章能对你有所帮助。
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- λ可以适应STL吗?
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 在C++中迭代 STL 集时出现奇怪的问题<CStudent>
- 如何在 C++17 STL 并行算法中处理调度?
- 在学习数据结构之前对STL有一个了解是好的吗?
- C++ STL 排序会检查 NaN 吗?