代码之家  ›  专栏  ›  技术社区  ›  leon

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

  •  7
  • leon  · 技术社区  · 9 年前

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

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

    向量是否为容器?vector是标准库的类还是属于STL?

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

    4 回复  |  直到 9 年前
        1
  •  9
  •   Community Mike Causer    7 年前

    C++标准库中没有任何内容 “属于” 到STL。STL是一个不同的库 影响 C++标准库中的许多部分。从标记wiki:

    [STL]是一个C++库, 和函数对象。 当C++被标准化时 STL被引入标准库 , []

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

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

        2
  •  3
  •   Community Mike Causer    7 年前

    在我看来 STL c++标准库与 Linux GNU/Linux :

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

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

    this answer ,Bjarne Stroustrup,C++的发明人, described STL

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

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

    标准库中引入的其他重要STL特性包括当前所体现的函数式编程的新范式 <algorithm> 在我看来,它通过补充传统的面向对象编程范式,振兴了C++作为一种语言的地位。

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

        3
  •  2
  •   TLOlczyk    9 年前

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

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

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

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

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

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

        4
  •  0
  •   leon    9 年前

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