Здравствуйте, srggal, Вы писали:
S>Здравствуйте, Jonathan, Вы писали:
J>>>>в задании небыло указано должен код соответствовать стандарту или нет. J>>>>было только: "Напишите компелябельный код для вызова чистовиртуальной функции" J>>>>Что я с успехом и продемонстрировал
S>>>Настолько Вы со мной несогласны, что даже в виде минуса выразили, чтож, не поленитесь, S>>>гляньте сюда Что такое ill-formed код ? ill-formed == UB ?
J>>А причем тут ето? J>>см. задание!!! J>>
S>Блин. Не хотел писать, дабы не вдаваться в непонятную дискуссию, больше на эту тематику — не отвечаю.
S>В задании, как Вы процитировали написано: S>
S>Напишите компелябельный код для вызова чистовиртуальной функции
S>ТОт код, который привели вы — ill-formed, далее я дал ссылку на то, что ill-formed код — не является компилябельным, с одним исключением — нарушение ODR — может не диагностироваться компилятором.
S>Резюмируем: S> Ваш код не соответсвует условию задачи — он не копилябельный.
Еще как компелябельный, причем не только у меня.
покрайней мере H. Sutter со мной согласен.
См. пример:
"This is the original GotW problem and solution substantially as posted to Usenet. See the book More Exceptional C++ (Addison-Wesley, 2002) for the most current solution to this GotW issue. The solutions in the book have been revised and expanded since their initial appearance in GotW. The book versions also incorporate corrections, new material, and conformance to the final ANSI/ISO C++ standard."
Здравствуйте, creatman, Вы писали:
C>Здравствуйте, Jonathan, Вы писали:
J>>в задании небыло указано должен код соответствовать стандарту или нет.
C>Если он ему не соответствует вы не прошли собеседование.
У H.Sutter прошел бы
Смотри пример:
"This is the original GotW problem and solution substantially as posted to Usenet. See the book More Exceptional C++ (Addison-Wesley, 2002) for the most current solution to this GotW issue. The solutions in the book have been revised and expanded since their initial appearance in GotW. The book versions also incorporate corrections, new material, and conformance to the final ANSI/ISO C++ standard."
Здравствуйте, Amouse, Вы писали:
A>Здравствуйте, creatman, Вы писали:
C>>Вобще один мой друг (очень хороший специалист со стажем уже более 8-ми лет) на собеседовании ведет себя примерно так:
C>>Когда ему начинают задавать вопросы по типу хитроумных, на знание стандарта, он отвечает просто "Ребята вы меня грузите, я могу вас сам щас загрузить так, что вы усомнитесь в себе как в специалистах. Вот вы мне задали задачку ....., хорошо я её решу, но прежде чем я начну решать задачу я дам вам свою задачу", тут он пишет свою задачку на листке и протягивает её интервьюверу со словами "Если вы не решаете эту задачу, то я сомневаюсь в вашей достаточной квалификации и не собераюсь работать в вашей компании с бездарностями". Самое смешное, что один раз когда он собеседовался, интервьювер так и не решил его задачу (то был тим лидер крупной софтовой компании). А второй раз все дружно посмеялись и прекратили собеседование
C>>ИМХО это правильный подход. Собеседование это не тест а диалог. И ты вправе проверить квалификацию сотрудников компании если у тебя есть сомнения.
A>неправильное поведение на собеседовании, A>логики в таком поведении нет, A>есть только, уж простите за психоанализ, внутреннее недовольство, что это его собеседуют, а не он.
Видишь ли в чем дело, по тому какой вопрос задаст интервьюируемый тоже можно судить о его уровне
(да и вообще вопросы — это повод для разговора).
Умный интервьюер это поймет и оценит.
Здравствуйте, Jonathan, Вы писали:
J>скомпилируй в VC++ 6.0
В Visual C++ используется язык довольно похожий на стандартный C++,
но все же не его нельзя назвать С++. Это "C++. MS VC++ 6.0 edition".
Он вообще славен своими косяками. Никому не рекомендую.
Здравствуйте, mr_jek, Вы писали:
_>Здравствуйте, Vanger84, Вы писали:
V>>знаеш что реально показывает этот вопрос! это то что читал ли соискатель статью где реализаваг факториал или нет! 100% с ходу не кто не напишет это! можете проверить на своих колегах!
_>Кстати, после прочтения "Александреску" такая задача решается на ура, _>проверено на 3 "коллегах", правда есть зависимость от того как давно испытуемый _>читал что-то подобное, но как я говорил решать вообще не обязательно
Видимо это характеризует задачу как жутко полезную ??
Здравствуйте, Amouse, Вы писали:
A>неправильное поведение на собеседовании, A>логики в таком поведении нет, A>есть только, уж простите за психоанализ, внутреннее недовольство, что это его собеседуют, а не он.
Почему ты решил что это его собеседуют ? А не он собеседует кандидатов на будущих работодателей ?.
Здравствуйте, <Аноним>, Вы писали:
А>нельзя так как он не отвчает требованием выдвинутым к контейнеру vector так что незя, подробнее можеш прочитать в книжке Маерса STL эфективное использование у него прям глава такая есть помоему
Показать наивную реализацию сложения строк на C, попросить оценить сложность , попросить улучшить асимптотику ?
Преимущества хеш таблиц перед бинарными деревьями и наоборот ?
Схематично реализовать планировщик задач кторый имеет линейную сложность от к-ва задач.
Мне всегда казалось это намного полезные вещи ?
Я встречал код где люди ЧЕСНО полагали что использование char* (извлекаемое из std::string) и далее работа с низкоуровневыми функциями УСКОРИТ программу.
Хотя мне порой кажется что я устарел , это теперь мало кого интересует ..
Здравствуйте, _Dreamer, Вы писали:
C>>Задачка первая: есть строка, её надо извернуть задом наперёд, не выделяя много дополнительной памяти. Смотреть на то, какой тип/класс претендент использует для строки; решает через индексы, указатели или итераторы; как делает swap. Грамотный программист на C++ должен в первую очередь сказать «std::reverse» и приступить к решению только тогда, когда ему скажут, что «+1, но мы хотим посмотреть, как Вы реализуете аналогичный алгоритм»
_D>можно поинтересоваться, как бы Вы оценили вот такие решения ваших задач ?
можно я?
_D>я позволил себе опустить некоторые проверки при решении. _D>1) реверс с указателями _D>
_D>char * str_reverse( char * str ) // все же лучше бы итераторы, на худой конец шаблон - вдруг wchar_t?
_D>{
_D> char temp = 0; // зачем он здесь? место ему в блоке while
_D> char * b = str, * e = str + strlen( str ) - 1; // по-хорошему всё же это бы в 2 строчки. А также std::strlen.
_D> while( b <= e ) // зачем нестрогое неравенство? UB при нулевой длине!
_D> //std::swap( *b++, *e-- ); // самый очевидный вариант для меня
// можно еще показать знание ADL, написав using std::swap; swap(...);
_D> //(*b++ = ( temp = *b, *e )), *e-- = temp; // за такое наверно можно и по шее схлопотать =)
_D> {
_D> temp = *b;
_D> *b++ = *e;
_D> *e-- = temp;
_D> }
_D> return str;
_D>}
_D>void test_str_reverse()
_D>{
_D> char str[] = {"hello world !"}; // смысл { } ?
_D> std::cout << str << std::endl;
_D> std::cout << str_reverse( str ) << std::endl;
_D>}
_D>
Я бы засчитал попытку. Если понадобится, ты сможешь переделать это и с итераторами, и с std::basic_string. Наличие тестирующей проги — плюс. Еще какая тонкость — напиши тест перед основной функцией, и вообще начинай с него, а потом уже функция.
C>>Задачка вторая: даны два множества целых чисел, представлены сортированными массивами. Найти их объединение (вариант: пересечение), в том же представлении.
_D>2) пересечение массивов через указатели. предполагал, что отсортированы по возрастанию, возможно с повторяющимися элементами. _D>для простоты предполагал, что массивы одной длинны. обьединение у меня получилось еще более наивной и громоздкой, потому не стал показывать.
В первую очередь нужно вспомнить о std::set_intersection.
_D>
_D>template < int size > // std::size_t
_D>void print_array( int (&array)[size], int print_size = size ) // std::copy, std::ostream_iterator?
_D>{
_D> for( int ii = 0; ii < print_size; ++ii )
_D> std::cout << array[ii] << " ";
_D> std::cout << "\n";
_D>}
// ну здесь template и итераторы так и просятся...
_D>void arrays_intr( const int *ar1, const int *ar2, int *res, const int size, int *res_size ) // почему res_size не ссылка?
_D>{
_D> const int *ar1_end = ar1 + size, *ar2_end = ar2 + size;
_D> *res_size = 0;
_D> while( ar1 < ar1_end && ar2 < ar2_end ) // привыкай к !=
_D> {
_D> if ( *ar1 == *ar2 ) // тебе не обещали EqualityComparable (ты же ведь добавишь template и расширишь функцию для всевозможных типов, не так ли?)
_D> {
_D> if ( (*res_size) == 0 || *(res - 1) != *ar1 ) // Эта строчка вообще лишняя. "abbbbccdff" * "aabbccdef" = "abbccdf".
// Эквивалентных элементов брать по минимуму из двух последовательностей.
_D> {
_D> *res++ = *ar1;
_D> ++(*res_size);
_D> }
_D> ++ar1;
_D> ++ar2;
_D> }
_D> else
_D> {
_D> *ar1 > *ar2 ? ++ar2 : ++ar1; // и operator > тоже не обязан присутствовать
_D> }
_D> }
_D>}
_D>void test_arrays()
_D>{
_D> int ar1[] = { 1, 2, 3, 5, 5, 71 };
_D> int ar2[] = { 0, 1, 2, 3, 4, 5 };
_D> const int size = sizeof( ar1 ) / sizeof( ar1[0] ); // поищи на кывте ARRAY_LENGTH и удиви интервьеров :)
_D> int res_intr[ size ] = {0};
_D> int res_size = 0;
_D> print_array( ar1 );
_D> print_array( ar2 );
_D> arrays_intr( ar1, ar2, res_intr, size, &res_size );
_D> print_array( res_intr, res_size );
_D>}
_D>
При некоторых возможных недостатках сия программа имеет важнейшее преимущество: работает (ведь так?). Я бы, опять же, дал положительную оценку. На собеседовании и не таких граблей можно наставить
Тебе стоит изучить Generic Programming. Поищи, где-то на этом форуме были ссылки на сайт, откуда можно скачать полезные книги, писанные гуру вроде Саттера, Александреску, Мейерса и др.
Приложение 1 Так STLport делает set_intersection, если чуть упростить (не любят в STLport постфиксные операторы):
template <class InputIter1, class InputIter2, class OutputIter>
OutputIter set_intersection(InputIter1 first1, InputIter1 last1,
InputIter2 first2, InputIter2 last2,
OutputIter result)
{
while(first1 != last1 && first2 != last2) // как думаешь, какое из этих условий с большей вероятностью сработает первым?
// и, соответственно, какое из них лучше поместить в начало?
{
if(*first1 < *first2)
{
++first1;
}
else if(!(*first2++ < *first1)) // равняются
{
*result++ = *first1++;
}
}
return result;
}
Приложение 2 А так — reverse:
template <class BidirectionalIter>
void reverse_impl(BidirectionalIter first, BidirectionalIter last, bidirectional_iterator_tag)
{
for(; first != last && first != --last; ++first)
{
iter_swap(first, last);
}
}
template <class RandomAccessIter>
void reverse_impl(RandomAccessIter first, RandomAccessIter last, random_access_iterator_tag)
{
for (; first < last; ++first)
{
iter_swap(first, --last);
}
}
template <class BidirectionalIter>
void reverse(BidirectionalIter first, BidirectionalIter last)
{
reverse_impl(first, last, typename iterator_traits<BidirectionalIter>::iterator_category());
}
Здравствуйте, Андрей Хропов, Вы писали:
АХ>Здравствуйте, Jonathan, Вы писали:
J>>скомпилируй в VC++ 6.0
АХ>В Visual C++ используется язык довольно похожий на стандартный C++, АХ> но все же не его нельзя назвать С++. Это "C++. MS VC++ 6.0 edition". АХ> Он вообще славен своими косяками. Никому не рекомендую.
А чем еще можно пользоватся на Windows в серъезном проекте?
(поделки от багланда не в счет)
"If everything seems under control, you're just not going fast enough"
: то, что специализировано два значения, наталкивает на мысль, что воспроизведен по памяти гибрид факториала и чисел Фибоначчи. Таким образом, "простейший тест на знание шаблонов" показал, что был прочитан пример про числа Фибоначчи и человек знает, что такое факториал.
Здравствуйте, Roman Odaisky, Вы писали:
RO>можно я?
Спасибо за отзыв
Общая претензия насчет шаблонов и обобщенного программирования — я специально не стал пытаться создавать универсальные решения, предполагая что так оно будет проще, я ведь не претендовал на место =)) обобщить то не проблема, хотя конечно есть тонкие места )
общий стиль решений получился Сишный, потому и указатели вместо ссылок, и namespace std не используется. для выдержанности стиля так сказать
ADL — да, не подумал, это идея.
RO>Я бы засчитал попытку. Если понадобится, ты сможешь переделать это и с итераторами, и с std::basic_string. Наличие тестирующей проги — плюс. Еще какая тонкость — напиши тест перед основной функцией, и вообще начинай с него, а потом уже функция.
благодарю за поправку. я то писал в IDE, там конечно тест был сначала,потом уже решение.
кстати, а интервью как бы вы проводили ? на бумаге или в IDE ?
и насчет времени на такие задачи ? полчаса ? 20 минут ?
RO>В первую очередь нужно вспомнить о std::set_intersection.
но потом же все равно будет — "мы бы хотели посмотреть как вы решите эту задачу"
да. size_t вместо int — это мое упущение, виноват.
насчет ARRAY_LENGHT — ну я бы сказал, что код в 7- 10 строк для вычисления длинны массива, которая делается 1 раз — это выпендреж ) однако, удивить конечно можно
в итоге — достаточно позитивная оценка на мой взгляд, замечания справедливы, но не так страшны
вывод — шлифовать и практиковаться. на текущий момент C++/C это не основной язык моих задач, хотя любовь давняя =)
Здравствуйте, _Dreamer, Вы писали:
RO>>можно я? _D>Спасибо за отзыв _D>не стал пытаться создавать универсальные решения, предполагая что так оно будет проще [...]
Точно? Посмотри на свою версию set_intersection. Приходится возвращать количество значений по ссылке. STL-ный подход же — вернуть итератор, подвинутый на сколько надо. Проще и красивее.
_D>ADL — да, не подумал, это идея.
Собственно, вот такое:
template <class X>
void adl_swap(X& u, X& v)
{
using std::swap;
swap(u, v);
}
— всего лишь workaround для случая глупых девелоперов, разместивших swap в своем пространстве имен. Они должны были специализировать std::swap. (Впрочем, стандарт 98 года явно запрещал такую специализацию, так что, возможно, проблема в legacy-коде.)
_D>кстати, а интервью как бы вы проводили ? на бумаге или в IDE ?
Однозначно на бумаге. Я приводил здесь рядом статью Joel Spolski, так вот, тест на бумаге покажет в большей степени Smartness, тест на компе — Getting-Things-Done-ness. И то, и другое важно. Но в IDE все напишут идеальный strrev... только надо будет дописать (c) P. J. Plauger или в этом роде
_D>и насчет времени на такие задачи ? полчаса ? 20 минут ?
Ответ простой: не знаю. Есть вот еще такая абстрактная идея: может, заранее огласить определенное задание и требовать его выполненным идеально? С точки зрения эффективности, универсальности, Exception Safety, повторного использования кода, человекопонятности и т. п. Вот и видно будет, что человек умеет (в т. ч. и пользоваться Google ), и как он доводит дела до конца.
_D>насчет ARRAY_LENGHT — ну я бы сказал, что код в 7- 10 строк для вычисления длинны массива, которая делается 1 раз — это выпендреж ) однако, удивить конечно можно
Здравствуйте, Jonathan, Вы писали:
J>Здравствуйте, Андрей Хропов, Вы писали:
АХ>>Здравствуйте, Jonathan, Вы писали:
J>>>скомпилируй в VC++ 6.0
АХ>>В Visual C++ используется язык довольно похожий на стандартный C++, АХ>> но все же не его нельзя назвать С++. Это "C++. MS VC++ 6.0 edition". АХ>> Он вообще славен своими косяками. Никому не рекомендую.
J>А чем еще можно пользоватся на Windows в серъезном проекте? J>(поделки от багланда не в счет)
Я говорил про VC++ 6.0 (просто в первом предложении 6.0 пропустил).
В .NET 2003 и тем более 2005 все намного лучше.
Здравствуйте, Андрей Хропов, Вы писали:
АХ>Видишь ли в чем дело, по тому какой вопрос задаст интервьюируемый тоже можно судить о его уровне АХ>(да и вообще вопросы — это повод для разговора). АХ>Умный интервьюер это поймет и оценит.
тема конечно флеймовая, в общем спорить не буду, а только попрошу сказать, если это не секрет конечно,
в какую компанию устроился этот товарищ после такого собеседования,
жуть как интересно
U>>An auto_ptr is a pointer that serves as owner of the object to which it refers (if any). As a result, an object gets destroyed automatically when its auto_ptr gets destroyed. A requirement of an auto_ptr is that its object has only one owner.
V>это язнал но понел тока сейчас..... типо когда мы попытаемся взять из контейнера auto_ptr он удалится в контейнере так?
да, типа того
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Эх, люблю выпить и переспать с кем нибудь!
Но чаще выходит перепить с кем — нибудь и выспаться...
Здравствуйте, Андрей Хропов, Вы писали:
АХ>В Visual C++ используется язык довольно похожий на стандартный C++, АХ> но все же не его нельзя назвать С++. Это "C++. MS VC++ 6.0 edition". АХ> Он вообще славен своими косяками. Никому не рекомендую.
Для своего времени это был весьма приличный компилятор. Много есть промышленных компиляторов которым больше 8 лет и они все еще используються?
"For every complex problem, there is a solution that is simple, neat,
and wrong."