我最近正在查看一份职位,其中一项要求是,一个人对STL的知识是9/10。
当我判断自己的技能时,对我来说10是有人写这个主题的高级书籍,如Jon Skeet(C#),John Resig(JavaScript)或Martin Odersky(Scala)。
所以,9/10基本上是10,所以我不确定该级别的预期。
可以在http://discuss.joelonsoftware.com/default.asp?joel.3.414500.47
找到一些问题的示例显然需要一些编码,但是应该记住所有内容,因为STL中有相当多的编码。
在某些情况下,Boost库会扩展STL,所以我也应该使用Boost,因为我有时会混淆哪个函数来自两个库中的哪一个。
我想知道我是否可以回答STL专家所期望的问题,尽管奇怪的是,成为C ++专家不是必需的。
更新
在回答了我的问题的答案之后,似乎他们可能正在寻找的是可以看到STL限制并扩展库的人,这是我没有做过的事情。我习惯于在STL和Boost给我的范围内思考并保持在线内。我可能需要开始考虑这是否过于局限,看看我是否可以跳出盒子。我希望他们不像谷歌那样意味着9。 :)
答案 0 :(得分:12)
搞笑 - 我不认为自己是STL中的9/10(我曾经是,但现在我有点生疏了),我完全同意@joshperry重要的术语区别(我经常有人指责STL的滥用意味着“最初受SGI的STL启发的C ++标准库的部分”! - ),但我认为他的示例代码不是“最佳STL-ish”。我的意思是,对于给定的任务“将所有整数放在矢量中以标准输出。”,为什么任何曾经代码,正如@joshperry建议的那样,
for(std::vector<int>::iterator it = intVect.begin(); it != intVect.end(); ++i)
std::cout << *it;
而不是显而易见的:
std::copy(intVect.begin(), intVect.end(), std::ostream_iterator<int>(std::cout));
之类的?!对我来说,这有点暗示他们不会知道关于std::ostream_iterator
- 特别是如果他们应该炫耀他们的STL知识,他们为什么不炫耀它呢? - )
在我现在的雇主,帮助候选人自我评价技术的能力,我们提供了一个有用的指导 - “10:我发明了那项技术; 9:我写了关于它的书”等等。所以,例如,我在Python中是9/10 - 只有我的同事和朋友Guido可以在那里公平地声称一个10/10。 STL是一个有趣的案例:当Stepanov推动设计时,我的同事Matt Austern做了第一个实现和写了“关于它的书”(this one) - 所以我认为他如果不是10,则可以声称是9.5。按照这个标准,我可以在7到8之间,如果我可以花一个小时刷新(自定义分配器和特性总是很棘手,或者至少我记得这些! - 。)。
所以,如果你正在探测一个声称9的人,将它们放在真正的硬件上,例如自定义分配器和特性 - 可能他们不会错过所有容器,算法和特殊迭代器的节拍,所以不要浪费太多的采访时间(如果你正在探索7或7.5那将是关键)。也许让他们给出一个真实的例子,他们使用自定义特征和/或分配器,并编写实现的所有细节以及一些样本用途。
顺便说一下,如果你是那个需要 cram 在C ++的高级标准库上的人,那么知识渊博且非生锈的朋友告诉Josuttis book如今比我的朋友马特更有用(不幸的是,我从来没有深入阅读过Josuttis,所以我无法确认或否认 - 我确实看到这本书在亚马逊上有五颗星,其中 令人印象深刻的; - 。)答案 1 :(得分:2)
这对工作来说只是一个愚蠢的要求。在招聘时,你首先需要一个 good 伟大的程序员,具体的知识第二。
在这个时代,期待STL的知识/熟悉度等是合理的。但除非工作重新实施STL,否则你不需要9/10。即使那个 这个工作,你仍然需要一个有很多模板经验的优秀程序员(不仅仅是使用)。
例如,对于“输出向量的整数”的所有答案,可能会生成完全相同的代码。只有模板化处理任何项目的任何容器的版本显示出“好”与“好”的暗示(只是一个提示)。即抽象的能力。
无论如何,只是去吧。准备好使用STL来帮助解决其他问题。没什么。
(事实上,对于我去过的大部分采访,要求是不使用STL。即 - 编写一个反转字符串的函数。我的第一个答案是std lib中可能存在某些内容当然,他们说,当然,但如果你必须自己编写它,那该怎么办...)
答案 2 :(得分:2)
我应该在前言中指出,我认为相同的标准不仅应适用于STL(无论您更喜欢哪种定义),还应适用于许多其他类型的事物。
从我的角度来看,仅仅知道现有的STL组件并且能够很好地应用它们可能不应该被认为是9/10。相反,我认为这个级别约为7/10。 8/10是指该人能够通过提供符合其理念并且能够自然而轻松地适应现有组件的新组件来扩展 STL。
到9月10日,我希望看到有人不仅可以提供新的组件,而且能够改进一些现有组件,例如Boost :: bind。对于10/10,我希望看到这超出了9/10的相当临时的本地化改进,并转向更具体的架构级别,例如使用范围而不是单独的迭代器。举一个具体的例子,考虑Boost范围和Andrei Alexandrescu对范围的想法之间的区别。 Boost的范围很方便,实用且方便,但它们会改变你输入的内容,而不是你的想法。 Andre的版本范围更为全面 - 一种架构解决方案,可以改变您设计和思考代码的方式,而不仅仅是您如何键入代码。
答案 3 :(得分:1)
好吧,你可以走进面试并说“我注意到你的帖子要求知识渊博的STL,但这个术语有时用来表示:(1)C ++标准库;(2)Stepanov在HP设计的库;(3)基于[2]的[1]部分;(4)[1],[2]或[3]的具体供应商实现;(5)[2]的基本原则。 ,这个词非常模糊,必须非常谨慎使用。如果你的意思是[1]而且坚持缩写,“stdlib”是一个更好的选择。“*
老实说,虽然因为它是一个图书馆,它有点有限,可能无法像无法正确的语言那样令人作呕。所以我想说任何让他们使用stdlib算法的问题都能有效地看出他们是否熟悉它们。
由于迭代器是stdlib不可或缺的一部分,我也可能会要求它们“将所有整数放在向量中以标准输出”。我希望有类似的东西:
// thanks to onebyone
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " ");
如果他们写了类似下面的东西,他们可能不太熟悉迭代器:
for(int i = 0; i < vec.size(); ++i)
std::cout << vec[i];
另外一个有趣的事情是,如果他们在代码文件的顶部做using namespace std
。问他们为什么,如果他们没有说“我只使用那个简短的演示代码”,或者他们把它放在一个头文件中,感谢他们进来并将它们发送出门。
stdlib的另一个方面是它大量使用模板,这个人应该对类型替换的基本模板编程有很好的理解。也许让他们“编写一个函数,将任何stdlib容器的所有项目写入标准输出”。我希望看到类似的东西:
template<typename InputIter>
void Output(InputIter it, InputIter end) {
while(it != end)
std::cout << *it++;
}
这些可能不是9/10问题,但有趣的是我认为2-3 / 10应该知道。
我要说的一个9/10难度是在不使用boost流基类的情况下正确编写派生的iostream。但使用 stdlib和扩展之间可能存在很大差异......
*(感谢nolyc对freenode ## C ++的报价)
答案 4 :(得分:1)