На что вопросы должны эксперт в STL, как ожидать, ответят в интервью

static class EnumerableExtensions
{
    public static IEnumerable<T> Flatten<T>(this IEnumerable<IEnumerable<T>> sequence)
    {
        foreach(var child in sequence)
            foreach(var item in child)
                yield return item;
    }
}

, Возможно, как это? Или Вы подразумеваете, что это мог потенциально быть infintly глубоко?

10
задан James Black 7 November 2009 в 20:25
поделиться

5 ответов

Забавно - я не считаю себя 9 из 10 в STL (раньше был, но сейчас немного подзабыл), и я полностью согласен с важностью @joshperry терминологическое различие (я часто замечал, что злоупотребление STL означает «части стандартной библиотеки C ++, которые изначально были вдохновлены SGI STL»! -), но я считаю его примерный код менее чем «оптимально STL- иш ". Я имею в виду, что для данной задачи «Вывести все целые числа в векторе на стандарт», зачем кому-то когда-либо кодировать, как предлагает @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: Я написал THE книга об этом »и так далее. Так, например, я бы получил 9/10 в Python - только мой коллега и друг Гвидо может справедливо претендовать на 10/10. STL - интересный случай: пока Степанов руководил дизайном, мой коллега Мэтт Остерн делал первую реализацию , а тоже написал «свою» книгу об этом ( эта ) - так что я думаю, он получит если не 10, то 9,5. По этому стандарту я мог бы быть где-то между 7 и 8, если бы я мог потратить час на обновление (настраиваемые распределители и трейты всегда сложны, или, по крайней мере, я их так запомнил! -).

Итак, если вы ' повторно исследуя кого-то, кто претендует на 9, подбрасывайте их по действительно сложным частям, таким как настраиваемые распределители и трейты - по-видимому, они не пропустят ни одной детали по всем контейнерам, алгоритмам и специальным итераторам, поэтому не тратьте много времени по тем (что было бы ключевым, если бы вы зондировали 7 или 7,5). Может быть, попросите их привести реальный пример, в котором они использовали специальные черты и / или распределители, и закодировать все детали реализации, а также несколько примеров использования.

Кстати, если вам нужно втиснуть в стандартную библиотеку C ++ на продвинутом уровне. Знающие и неопытные друзья говорят мне, что книга Йосуттиса сегодня даже более полезна, чем книга моего друга Мэтта (к сожалению, я » Я никогда не читал Джозаттиса глубоко, так что могу »

12
ответ дан 3 December 2019 в 20:42
поделиться

Я должен предварять это, отметив, что я считаю, что те же критерии следует применять не только к STL (независимо от того, какое определение вы предпочитаете для этого), но и ко многим другим типам вещей.

С моей точки зрения, простое знание существующих компонентов STL и умение их правильно применять, вероятно, не должно квалифицироваться как 9 из 10. Скорее, я бы назвал этот уровень примерно 7/10. 8/10 - это когда человек может расширить STL, предоставив новые компоненты, которые следуют его философии и естественно и легко подходят к существующим.

К 9/10 я ожидал увидеть кто-то, кто может не только предоставить новые компоненты, но и может улучшить некоторые из существующих, например Boost :: bind. Для 10/10 я ожидал увидеть, что это выйдет за рамки довольно спонтанного, локализованные улучшения 9/10 и переход к более архитектурному уровню, например к использованию диапазонов вместо отдельных итераторов. В качестве конкретного примера рассмотрим разницу между диапазонами Boost и идеями Андрея Александреску для диапазонов. Диапазоны Boost удобны, полезны и удобны, но они меняют то, что вы вводите, а не то, как вы думаете. Версия диапазонов Андре гораздо более всеобъемлющая - архитектурное решение, которое меняет то, как вы проектируете и думаете о коде, а не только то, как вы его набираете.

но они меняют то, что вы печатаете, а не то, как вы думаете. Версия диапазонов Андре гораздо более всеобъемлющая - архитектурное решение, которое меняет то, как вы проектируете и думаете о коде, а не только то, как вы его набираете.

но они меняют то, что вы печатаете, а не то, как вы думаете. Версия диапазонов Андре гораздо более всеобъемлющая - архитектурное решение, которое меняет то, как вы проектируете и думаете о коде, а не только то, как вы его набираете.

2
ответ дан 3 December 2019 в 20:42
поделиться

Ну, вы могли бы прийти на собеседование и сказать: «Я заметил, что в вашей публикации просили кого-то, кто разбирается в STL, но этот термин иногда используется для обозначения: (1) стандартная библиотека C ++; (2 ) библиотека Степанова, разработанная в HP; (3) части [1], основанные на [2]; (4) реализации конкретных поставщиков [1], [2] или [3]; (5) основные принципы of [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];

Еще одна интересная вещь, на которую стоит обратить внимание, - это если они делают с использованием пространства имен std в вверху своего файла кода. Спросите их, почему, и если они не скажут что-то вроде «Я использую это только для короткого демонстрационного кода», или если они поместят это в файл заголовка, поблагодарите их за то, что пришли, и отправьте их за дверь.

Другой аспект stdlib - это интенсивное использование шаблонов, человек должен хорошо понимать основы программирования шаблонов для подстановки типов. Может быть, попросите их "

1
ответ дан 3 December 2019 в 20:42
поделиться

Это просто глупое требование для работы. При приеме на работу вам, во-первых, нужен хороший великий программист, во-вторых, конкретные знания

. В наши дни и в этом возрасте было бы разумно ожидать знания / знакомства / и т.д. с STL. Но если задача не состоит в том, чтобы заново реализовать STL, вам не нужно 9/10. Даже если эта является работой, вам все равно нужен отличный программист, имеющий большой опыт работы с шаблонами (а не только с их использованием).

Например, для всех ответов на «выведите целые числа вектор ", вероятно, генерируется точно такой же код. Только версия, которая была разработана для обработки любого контейнера любых элементов, показывает намек на «отличный» или «хороший» (просто намек). то есть способность абстрагироваться.

Так или иначе, просто пойти на это. Будьте готовы использовать STL для решения других проблем. Ничего более.

(На самом деле, для большинства интервью, в которых я участвовал, требовалось НЕ использовать STL. Т.е. написать функцию, которая переворачивает строку. Мой первый ответ - что, вероятно, что-то есть в std lib, которая бы это сделала. Тогда они говорят: да, конечно, но что, если бы вам пришлось написать это самому ...)

2
ответ дан 3 December 2019 в 20:42
поделиться

9/10 довольно субъективно. Мне задали хорошие вопросы о STL. Это примеры:

  • Когда следует использовать двухстороннюю очередь вместо вектора (полезно знать, как они реализованы внутри)
  • Распознать код STL, который использует недопустимые ссылки или может в конечном итоге использовать недопустимые ссылки.
  • Реализовать простые операции с разными контейнерами и знать, где и когда использовать std :: algorithm по сравнению с функциями-членами контейнера.
1
ответ дан 3 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: