最近我正在开发一个c ++项目,我不允许使用标准模板库或任何其他模板。
在做了一些研究后,我很困惑。什么是容器属于标准库,而其他容器属于标准模板库?或者我们不说标准库的容器,对吗?
矢量是否是容器? vector是标准库的类还是属于STL?
我希望在标准库中实现一些结构列表,我可以使用list或vector吗?
答案 0 :(得分:9)
C ++标准库中没有任何内容“属于”到STL。 STL是一个不同的库,只有影响 C ++标准库中的许多部分。来自标签wiki:
[STL]是一个通用容器,迭代器,算法的C ++库, 和函数对象。 当C ++标准化时,大部分内容 STL被纳入标准库,[...]
但是,很多人将C ++标准库称为标准模板库,这并不完全正确。我猜测如果你不允许使用STL,它们实际上意味着你不能使用C ++标准库。但你必须要求他们知道他们的真正含义。
有关详细信息,请参阅What's the difference between "STL" and "C++ Standard Library"?
答案 1 :(得分:3)
在我看来,def mapper(row):
value = 0 #some computation here
row.append(newvalue = value) #??? something like that
return row
data = sqlContext.jsonFile("data.json")
mapped = data.flatMap(mapper)
#do further mappings with the new field
和c ++标准库之间的区别有点类似于STL
和Linux
之间的关系:
历史上,STL是核心(包括容器,算法和迭代器等),标准库是一个完整的操作系统,围绕核心构建其他所有东西。标准库在STL之上进行了修改,但标准库的那部分源于STL。 (还记得GNU人们试图提醒我们Linux只是一个内核并坚持调用操作系统GNU / Linux吗?)
如果标准委员会正在撰写论文而不是c ++标准,他们可能需要在重叠域中的所有地方承认GNU/Linux
,而不是声称差异。
正如this answer中的评论中指出的那样,C ++的发明者Bjarne Stroustrup,described STL为
STL(“标准模板库”;即容器和 ISO C ++标准库的算法框架)
此外,标准库中引入的STL的核心功能是每个 STL算法必须具有预先指定的最坏情况算法复杂度的概念,使实施STL成为一项不重要的事情。人们只需关注STL容器或算法的规范,历史上在SGI网站上托管其他来源。这在史前时代是非常重要的,每个人都可以拿出自己的容器,计算复杂程度不同。
标准库中引入的其他重要的STL特性包括当前STL
和其他地方所体现的新的函数式编程范例,在我看来,通过补充传统的面向对象编程,使C ++重新焕发活力。范例
从这个意义上讲,回到你的问题,我认为像<algorithm>
这样的容器属于vector
(最初)和标准库是公平的。
答案 2 :(得分:2)
在90年代早期,C ++中没有集合库。人们使用RogueWave,Booch组件或别的东西我忘了名字。这就是为什么你在QT中看到像QList这样的类的原因,因为他们需要一些东西。
当时,SGI有一个收集库,许多标准委员会都看到并且非常喜欢。它们基于很多人要求的集合库,并称之为STL。
截至今天,我会说用户已明确实例化它的库组件是STL的一部分。为了澄清,你作为std :: vector的用户必须指定它包含的内容,即std :: vector(1) 这意味着它是STL的一部分。 OTOH你不必实例化fstream,即使它是类似basic_fstream的typedef。
至于效率,STL非常精简和平均,这要归功于专业化和TMP等专家的作家。我能写一些更适合我的目的吗?我可以花一个月的时间写一些能满足我需求的东西,但是值得吗?
除了操作系统调用和C调用之外,整个C ++库都是模板化的(尽管像fstream一样),你可能永远都看不到它。所以他们禁止大部分的C ++库。(1)BTW我认为STL方法是最好的方法。其他集合要求您执行诸如从基类Collectible派生的事情。
答案 3 :(得分:0)
Thank you for all replies to my question. Some of own understanding on this problem: 1. When you are required to develop without STL or any other template library, you can only use library like ,,. You can only use pointer, string(maybe only char) and class in your program, which means you need to define your own data structure. 2. The purpose of not using STL is to test your understanding on basic c++ operation like new/delete, pointer, and class. Also another purpose I am thinking is to save memory. I faced this problem during an interview. I hope it would help you if you are facing the same case I faced before.