代码之家  ›  专栏  ›  技术社区  ›  James Black

STL专家在面试中应该回答哪些问题

  •  9
  • James Black  · 技术社区  · 16 年前

    我最近在看一份招聘启事,其中一项要求是,一个人在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

    5 回复  |  直到 16 年前
        1
  •  12
  •   Alex Martelli    16 年前

    有趣的是,我不认为自己是STL的9/10(我以前是这样的,但现在我有点生疏),我完全同意J.H.的重要术语区别(我经常记录STL的滥用,意思是“最初由SGI的STL启发的C++标准库的部分”!)然而,我认为他的示例代码要比“最佳STLISH”少。我的意思是,对于给定的任务“将向量中的所有整数放入标准输出”,为什么有人会这样做 曾经 代码,正如@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知识,为什么他们不炫耀呢?-)

    this one )--所以我想,如果不是10分,他会得到9.5分。按照这个标准,如果我能花一个小时刷新,我可能在7到8之间(自定义分配器和特性总是很棘手,或者至少我是这样回忆它们的!)。

    因此,如果你要调查一个声称拥有9的人,就要盘问他们真正困难的部分,比如自定义分配器和特性——想必他们不会错过所有容器、算法和特殊迭代器的一个节拍,所以不要在这些方面浪费太多采访时间(如果你是在调查7或7.5,这将是关键)。也许让他们给出一个实际例子,在这个例子中,他们使用了自定义特征和/或分配器,并对实现的所有细节以及一些示例使用进行了编码。

    顺便说一句,如果你是需要 在C++的高级标准库中,知识渊博且不生疏的朋友告诉我,Josuttis book 如今,这本书甚至比我朋友马特的书更有用(不幸的是,我从未深入阅读过《约瑟蒂斯》,所以我不能证实或否认这一点——我确实看到这本书在亚马逊上有五颗星,这是一本非常有趣的书 令人印象深刻;-)。

        2
  •  2
  •   tony    16 年前

    这只是一个愚蠢的工作要求。雇佣员工时,你需要一份工作 好的 首先是优秀的程序员,其次是专业知识。

    在这个时代,期望对STL有所了解/熟悉/等等是合理的。但除非工作是重新实现STL,否则你不需要9/10。即使这样 这项工作,你仍然需要一个伟大的程序员,拥有丰富的模板经验(制作而不仅仅是使用)。

    例如,对于“输出向量的整数”的所有答案,可能会生成完全相同的代码。只有模板化用于处理任何项目的任何容器的版本才会显示“很棒”与“不错”的提示(只是提示)。抽象的能力。

    不管怎样,去做吧。准备好使用STL来帮助解决其他问题。没别的了。

    (事实上,在我参加的大多数面试中,要求不要使用STL。ie-编写一个反转字符串的函数。我的第一个答案是std库中可能有这样的东西。然后他们说,是的,当然,但是如果你必须自己写呢……)

        3
  •  2
  •   Jerry Coffin    16 年前

    首先我要指出的是,我认为同样的标准不仅应该应用于STL(无论您喜欢哪种定义),还应该应用于许多其他类型的事物。

    延伸

    到9月10日,我希望看到一个不仅能提供 新的 组件,但能够改进一些现有组件,如Boost::bind。对于10/10,我希望看到它超越了9/10的特别的、本地化的改进,并朝着更高的体系结构级别发展,比如使用范围而不是单个迭代器。对于一个具体的例子,考虑Boost的范围和Andrei Alexandrescu关于范围的想法之间的差异。Boost的范围是方便、有用和方便的,但它们改变了你键入的内容,而不是你的思维方式。Andre版本的ranges更加全面——一个体系结构解决方案,它改变了您设计和思考代码的方式,而不仅仅是您键入代码的方式。

        4
  •  1
  •   joshperry    16 年前

    嗯,你可以走进采访中说:“我注意到你的帖子要求在STL有知识的人,但这个术语有时被用来指:(1)C++标准库;2) HP设计的Stepanov库(3) [1]中基于[2]的部分(4) [1]、[2]或[3]的特定供应商实现(5) [2]的基本原则。因此,该术语具有高度的模糊性,必须极其谨慎地使用。如果你是指[1]并坚持缩写,“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。但两者之间可能有很大的区别 使用 延伸

    *(感谢freenode###C++上的nolyc的报价)

        5
  •  1
  •   navigator    16 年前

    9/10相当主观。有人问了我一些关于STL的好问题。例如:

    • 什么时候应该使用deque vs vector(了解它们是如何在内部实现的很有帮助)
    • 识别使用无效引用或可能最终使用无效引用的STL代码。
    • 在不同的容器上实现简单的操作,并知道何时何地使用std::algorithm vs容器的成员函数。