Здравствуйте, Vanger84, Вы писали:
V>Здравствуйте, _DAle_, Вы писали:
_DA>>Здравствуйте, Vanger84, Вы писали:
V>>>Здравствуйте, _DAle_, Вы писали:
_DA>>>>Здравствуйте, Аноним, Вы писали:
А>>>>>нельзя так как он не отвчает требованием выдвинутым к контейнеру vector так что незя, подробнее можеш прочитать в книжке Маерса STL эфективное использование у него прям глава такая есть помоему
_DA>>>>Ну что значит нельзя. Можно, но с оглядкой на все отличия vector<bool> от vector<T>.
V>>>ну можно все если это оправдоно, есть просто вещи не входящии в состав стандарта.... вот vector<bool> не входит в стандарт
_DA>>А может сначала открыть этот самый стандарт, а потом уже что-то утверждать?
_DA>>
_DA>>23.2.5 Class vector<bool>
_DA>>To optimize space allocation, a specialization of vector for bool elements is provided:
_DA>>...
V>хм... может я ошибаюсь в книжке Майерса черным по белому написано что он не является стандартом??
Я к сожалению Майерса не читал, но думаю, что там написано, что vector<bool> не удовлетворяет требованиям, предъявляемым к стандартным контейнерам. Но он не мог написать, что его нет в стандарте.
Кстати, я там еще выше видел
я знаю что такое auto_ptr но видь он запрещен стандартом (и правильно)
auto_ptr не запрещен стандартом, просто нельзя использовать auto_ptr в стандартных контейнерах.
Здравствуйте, srggal, Вы писали:
S>Здравствуйте, Jonathan, Вы писали:
J>>в задании небыло указано должен код соответствовать стандарту или нет. J>>было только: "Напишите компелябельный код для вызова чистовиртуальной функции" J>>Что я с успехом и продемонстрировал
S>Настолько Вы со мной несогласны, что даже в виде минуса выразили, чтож, не поленитесь, S>гляньте сюда Что такое ill-formed код ? ill-formed == UB ?
Здравствуйте, Vanger84, Вы писали:
V>ну можно все если это оправдоно, есть просто вещи не входящии в состав стандарта.... вот vector<bool> не входит в стандарт
Что значит не входит в стандарт, про него там отдельная глава
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Напиши код который соответствует стандарту и компилируется любым компилятором. Я думаю это уточнение можно будет добавить без проблем на собеседовании.
Здравствуйте, Vanger84, Вы писали:
V>Здравствуйте, srggal, Вы писали:
S>>Здравствуйте, Vanger84, Вы писали:
V>>>а дай пожалуйсто ответ на этот вопрос...
S>>См. стандарт 15.4
S>>
S>>15.4/8
S>>Whenever an exception is thrown and the search for a handler (15.3) encounters the outermost block of a
S>>function with an exception-specification, the function unexpected() is called (15.5.2) if the exceptionspecification
S>>does not allow the exception.[Example:
S>>class X { };
S>>class Y { };
S>>class Z: public X { };
S>>class W { };
S>>void f() throw (X, Y)
S>>{
S>>int n = 0;
S>>if (n) throw X(); // OK
S>>if (n) throw Z(); // also OK
S>>throw W(); // will call unexpected()
S>>}
S>>—end example]
S>>15.4/9
S>>The function unexpected() may throw an exception that will satisfy the exception-specification for
S>>which it was invoked, and in this case the search for another handler will continue at the call of the function
S>>with this exception-specification (see 15.5.2), or it may call terminate().
S>>15.4/11
S>>A function with no exception-specification allows all exceptions. A function with an empty exceptionspecification,
S>>throw(), does not allow any exceptions.
S>>Кроме этого есть S>>
S>>15.5.1 The terminate() function
S>>...
S>>15.5.2 The unexpected() function
S>>...
S>>которые тоже можно глянуть
V>я попросил дать ответ не потомучто незнаю а потомучто хотел узнать как именно он был дал ответ на этот вопрос на собеседовании те не дают стандарт C++ чтобы ты в нем искал ответ! тебя спрашивают а ты сам должен сформулировать ответ....
Какая разница как бы дал его я. Я думаю тебе бы это вобще никакой информации бы не дало. Поскольку ты не интервьювер а я не на собеседовании. И даже если бы я не знал ответа то легко его нашел бы используя Google. А вот если бы ты сам написал сюда свой ответ, я думаю для тебя бы было больше пользы, может какие-нибудь для себя советы получил.
Здравствуйте, creatman, Вы писали:
C>Здравствуйте, Vanger84, Вы писали:
V>>Здравствуйте, srggal, Вы писали:
S>>>Здравствуйте, Vanger84, Вы писали:
V>>>>а дай пожалуйсто ответ на этот вопрос...
S>>>См. стандарт 15.4
S>>>
S>>>15.4/8
S>>>Whenever an exception is thrown and the search for a handler (15.3) encounters the outermost block of a
S>>>function with an exception-specification, the function unexpected() is called (15.5.2) if the exceptionspecification
S>>>does not allow the exception.[Example:
S>>>class X { };
S>>>class Y { };
S>>>class Z: public X { };
S>>>class W { };
S>>>void f() throw (X, Y)
S>>>{
S>>>int n = 0;
S>>>if (n) throw X(); // OK
S>>>if (n) throw Z(); // also OK
S>>>throw W(); // will call unexpected()
S>>>}
S>>>—end example]
S>>>15.4/9
S>>>The function unexpected() may throw an exception that will satisfy the exception-specification for
S>>>which it was invoked, and in this case the search for another handler will continue at the call of the function
S>>>with this exception-specification (see 15.5.2), or it may call terminate().
S>>>15.4/11
S>>>A function with no exception-specification allows all exceptions. A function with an empty exceptionspecification,
S>>>throw(), does not allow any exceptions.
S>>>Кроме этого есть S>>>
S>>>15.5.1 The terminate() function
S>>>...
S>>>15.5.2 The unexpected() function
S>>>...
S>>>которые тоже можно глянуть
V>>я попросил дать ответ не потомучто незнаю а потомучто хотел узнать как именно он был дал ответ на этот вопрос на собеседовании те не дают стандарт C++ чтобы ты в нем искал ответ! тебя спрашивают а ты сам должен сформулировать ответ....
C>Какая разница как бы дал его я. Я думаю тебе бы это вобще никакой информации бы не дало. Поскольку ты не интервьювер а я не на собеседовании. И даже если бы я не знал ответа то легко его нашел бы используя Google. А вот если бы ты сам написал сюда свой ответ, я думаю для тебя бы было больше пользы, может какие-нибудь для себя советы получил.
Я думаю тебе бы это вобще никакой информации бы не дало. \\ просто одно одело беседовать со знающим человеком который может быть тебя на несколько порядков выше а другое дело беседовать с junior который тока понтуется... соответственно и строится беседа.
Самое тупое занятие это беседовать с интервьювером который умеет тока задавать вопросы а ответы на них не знает.... так у меня и получилось 2 конторы мне задали вопрос что такое Абстрактный класс я естественно ответил они сказали что я не прав и не стали дальше обсуждать! и причем на мой вопрос "И что же по вашему такое абстрактный класс?" в одной конторе мне намекнули что не прелично у них спрашивать а вдругой медленно но верно дали определение интерфейса!
P.S.
мой ответ дословно "Абстрактный класс это класс которые имеет хотябы один чисто виртуальный метод"
Здравствуйте, _DAle_, Вы писали:
_DA>Здравствуйте, Vanger84, Вы писали:
V>>Здравствуйте, _DAle_, Вы писали:
_DA>>>Здравствуйте, Vanger84, Вы писали:
V>>>>Здравствуйте, _DAle_, Вы писали:
_DA>>>>>Здравствуйте, Аноним, Вы писали:
А>>>>>>нельзя так как он не отвчает требованием выдвинутым к контейнеру vector так что незя, подробнее можеш прочитать в книжке Маерса STL эфективное использование у него прям глава такая есть помоему
_DA>>>>>Ну что значит нельзя. Можно, но с оглядкой на все отличия vector<bool> от vector<T>.
V>>>>ну можно все если это оправдоно, есть просто вещи не входящии в состав стандарта.... вот vector<bool> не входит в стандарт
_DA>>>А может сначала открыть этот самый стандарт, а потом уже что-то утверждать?
_DA>>>
_DA>>>23.2.5 Class vector<bool>
_DA>>>To optimize space allocation, a specialization of vector for bool elements is provided:
_DA>>>...
V>>хм... может я ошибаюсь в книжке Майерса черным по белому написано что он не является стандартом??
_DA>Я к сожалению Майерса не читал, но думаю, что там написано, что vector<bool> не удовлетворяет требованиям, предъявляемым к стандартным контейнерам. Но он не мог написать, что его нет в стандарте.
_DA>Кстати, я там еще выше видел _DA>
_DA>я знаю что такое auto_ptr но видь он запрещен стандартом (и правильно)
_DA>auto_ptr не запрещен стандартом, просто нельзя использовать auto_ptr в стандартных контейнерах.
Текст из книжки (Майерса стр. 80) по поводу vector<bool>
vector<bool> как контейнер STL обладает лишь двумя недостатками. Вопервых это вообще не контейнер STL. Во вторых он не содержит bool.
Объект не становится контейнером STL только потому, что кто-то назвал его таковым — он становится контейнером STL лишь при соблюдении всех требований, изложенных в разделе 23.1 Стандарт С++.
Текст из книжки (Майерса стр. 48) по поводу auto_ptr
Совет 8. Никогда не создавайте контейнеры содержацие auto_ptr
Контейнеры auto_ptr (COAP, Containers Of Auto_Ptr) запрещены, а программа, которая попытается их использовать не будет компилироватся. Комитет по стандартизации С++ пролижил неслыханные усилия в этои направлении.
P.S.
А скижите пожайлусто еще почему нельзя делать vector<auto_ptr<t>> надеюсь прикол не в закрытом конструкторе по умолчанию?
Здравствуйте, Vanger84, Вы писали:
V>Здравствуйте, creatman, Вы писали:
C>>Здравствуйте, Vanger84, Вы писали:
V>>>Здравствуйте, srggal, Вы писали:
S>>>>Здравствуйте, Vanger84, Вы писали:
V>>>>>а дай пожалуйсто ответ на этот вопрос...
S>>>>См. стандарт 15.4
S>>>>
S>>>>15.4/8
S>>>>Whenever an exception is thrown and the search for a handler (15.3) encounters the outermost block of a
S>>>>function with an exception-specification, the function unexpected() is called (15.5.2) if the exceptionspecification
S>>>>does not allow the exception.[Example:
S>>>>class X { };
S>>>>class Y { };
S>>>>class Z: public X { };
S>>>>class W { };
S>>>>void f() throw (X, Y)
S>>>>{
S>>>>int n = 0;
S>>>>if (n) throw X(); // OK
S>>>>if (n) throw Z(); // also OK
S>>>>throw W(); // will call unexpected()
S>>>>}
S>>>>—end example]
S>>>>15.4/9
S>>>>The function unexpected() may throw an exception that will satisfy the exception-specification for
S>>>>which it was invoked, and in this case the search for another handler will continue at the call of the function
S>>>>with this exception-specification (see 15.5.2), or it may call terminate().
S>>>>15.4/11
S>>>>A function with no exception-specification allows all exceptions. A function with an empty exceptionspecification,
S>>>>throw(), does not allow any exceptions.
S>>>>Кроме этого есть S>>>>
S>>>>15.5.1 The terminate() function
S>>>>...
S>>>>15.5.2 The unexpected() function
S>>>>...
S>>>>которые тоже можно глянуть
V>>>я попросил дать ответ не потомучто незнаю а потомучто хотел узнать как именно он был дал ответ на этот вопрос на собеседовании те не дают стандарт C++ чтобы ты в нем искал ответ! тебя спрашивают а ты сам должен сформулировать ответ....
C>>Какая разница как бы дал его я. Я думаю тебе бы это вобще никакой информации бы не дало. Поскольку ты не интервьювер а я не на собеседовании. И даже если бы я не знал ответа то легко его нашел бы используя Google. А вот если бы ты сам написал сюда свой ответ, я думаю для тебя бы было больше пользы, может какие-нибудь для себя советы получил.
V>Я думаю тебе бы это вобще никакой информации бы не дало. \\ просто одно одело беседовать со знающим человеком который может быть тебя на несколько порядков выше а другое дело беседовать с junior который тока понтуется... соответственно и строится беседа.
Опятьже, эту информацию тебе всеравно будет сложно получить так как тут мы неограничены временем и под рукой Google, а читать я полагаю тут умеют все
V>Самое тупое занятие это беседовать с интервьювером который умеет тока задавать вопросы а ответы на них не знает.... так у меня и получилось 2 конторы мне задали вопрос что такое Абстрактный класс я естественно ответил они сказали что я не прав и не стали дальше обсуждать! и причем на мой вопрос "И что же по вашему такое абстрактный класс?" в одной конторе мне намекнули что не прелично у них спрашивать а вдругой медленно но верно дали определение интерфейса!
Вобще один мой друг (очень хороший специалист со стажем уже более 8-ми лет) на собеседовании ведет себя примерно так:
Когда ему начинают задавать вопросы по типу хитроумных, на знание стандарта, он отвечает просто "Ребята вы меня грузите, я могу вас сам щас загрузить так, что вы усомнитесь в себе как в специалистах. Вот вы мне задали задачку ....., хорошо я её решу, но прежде чем я начну решать задачу я дам вам свою задачу", тут он пишет свою задачку на листке и протягивает её интервьюверу со словами "Если вы не решаете эту задачу, то я сомневаюсь в вашей достаточной квалификации и не собераюсь работать в вашей компании с бездарностями". Самое смешное, что один раз когда он собеседовался, интервьювер так и не решил его задачу (то был тим лидер крупной софтовой компании). А второй раз все дружно посмеялись и прекратили собеседование
ИМХО это правильный подход. Собеседование это не тест а диалог. И ты вправе проверить квалификацию сотрудников компании если у тебя есть сомнения.
C>Вобще один мой друг (очень хороший специалист со стажем уже более 8-ми лет) на собеседовании ведет себя примерно так:
C>Когда ему начинают задавать вопросы по типу хитроумных, на знание стандарта, он отвечает просто "Ребята вы меня грузите, я могу вас сам щас загрузить так, что вы усомнитесь в себе как в специалистах. Вот вы мне задали задачку ....., хорошо я её решу, но прежде чем я начну решать задачу я дам вам свою задачу", тут он пишет свою задачку на листке и протягивает её интервьюверу со словами "Если вы не решаете эту задачу, то я сомневаюсь в вашей достаточной квалификации и не собераюсь работать в вашей компании с бездарностями". Самое смешное, что один раз когда он собеседовался, интервьювер так и не решил его задачу (то был тим лидер крупной софтовой компании). А второй раз все дружно посмеялись и прекратили собеседование
C>ИМХО это правильный подход. Собеседование это не тест а диалог. И ты вправе проверить квалификацию сотрудников компании если у тебя есть сомнения.
неправильное поведение на собеседовании,
логики в таком поведении нет,
есть только, уж простите за психоанализ, внутреннее недовольство, что это его собеседуют, а не он.
Здравствуйте, Vanger84, Вы писали:
V>Текст из книжки (Майерса стр. 48) по поводу auto_ptr
V>Совет 8. Никогда не создавайте контейнеры содержацие auto_ptr
V>Контейнеры auto_ptr (COAP, Containers Of Auto_Ptr) запрещены, а программа, которая попытается их использовать не будет компилироватся. Комитет по стандартизации С++ пролижил неслыханные усилия в этои направлении.
V>P.S. V>А скижите пожайлусто еще почему нельзя делать vector<auto_ptr<t>> надеюсь прикол не в закрытом конструкторе по умолчанию?
Это потому, что
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.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Эх, люблю выпить и переспать с кем нибудь!
Но чаще выходит перепить с кем — нибудь и выспаться...
Здравствуйте, <Аноним>, Вы писали:
А>>>и радуемся, как загибается компилятор...
Тут библиотека должна содержать либо контроль входных параметров, либо дисклаймер: "не передавайте в strlen NULL, не ищите факториал отрицательных чисел".
_>>и в чем ваше возражение?
_>>во-первых глупо вычислять n!, при n>33, резултат не влезет, тем более (UINT_MAX — 10)! _>>во-вторых это тест на понимание шаблонов, а не на вычисление (UINT_MAX — 10)!
А>Глупо вообще вычислять факториал рекурсивно. А>Рерсия на шаблонах имеет очень ограниченное применение и потому на обычном интервью такие вопросы не нужны.
Некоторые бустовские библиотеки (tuple, например) реализованы на списочных структурах — а тут без рекурсии никуда не деться.
Так что для общего развития — полезно
А>Гораздо важнее понимает ли человек рекурсию воообще. А>Это можно проверить дав ему нормальную задачу на рекурсивных структурах данных. А>А рекурсия на шаблонах — это всего лишь частный, очень неудачный, случай рекурсии вообще.
Как раз полезно для понимания.
ФП-языки, как правило, дружелюбны к линейной рекурсии и оптимизируют концевую рекурсию. А на С++ с этим облом (хотя есть способ...)
Вот более-менее рабочий код с логарифмической рекурсией (правда, сообщения об ошибках невнятны — но это можно доработать)
template<int N> struct fact;
template<int N, bool valid> struct fact1;
template<int N, int K> struct fact2; // N*(N+1)*...*(N+K-1)template<int N> struct fact { enum { value=fact1<N,(N>=0)>::value }; };
template<int N> struct fact1<N,true> { enum { value=fact2<1,N>::value }; };
template<int N> struct fact2<N,1> { enum { value=N }; };
template<int N> struct fact2<N,0> { enum { value=1 }; };
template<int N, int K> struct fact2 { enum { value=fact2<N,K/2>::value*fact2<N+K/2,K-K/2>::value }; };
template<bool v> struct test;
template<> struct test<true> {};
template<int N, int F> struct testfact : test< fact<N>::value==F > {};
template<int N> struct runfact : test< fact<N>::value!=0 > {};
testfact<0,1> t0;
testfact<1,1> t1;
testfact<5,120> t5;
//testfact<-1,1> tminus; // error: нет такого факториала - проверяем, ловит ли библиотека ошибки входных параметров
//testfact<5,121> tfault; // error: N! не равно F - проверяем, ловит ли наш тестер возможные ошибки
testfact<10, fact<9>::value*10> t10;
runfact<12> t12; // просто убеждаемся, что досюда он считает
//runfact<13> t13fault; // а досюда - уже нет
Здравствуйте, Ubivetz, Вы писали:
U>Здравствуйте, Vanger84, Вы писали:
V>>Текст из книжки (Майерса стр. 48) по поводу auto_ptr
V>>Совет 8. Никогда не создавайте контейнеры содержацие auto_ptr
V>>Контейнеры auto_ptr (COAP, Containers Of Auto_Ptr) запрещены, а программа, которая попытается их использовать не будет компилироватся. Комитет по стандартизации С++ пролижил неслыханные усилия в этои направлении.
V>>P.S. V>>А скижите пожайлусто еще почему нельзя делать vector<auto_ptr<t>> надеюсь прикол не в закрытом конструкторе по умолчанию? U>Это потому, что U>
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.
это язнал но понел тока сейчас..... типо когда мы попытаемся взять из контейнера auto_ptr он удалится в контейнере так?
Здравствуйте, ekamaloff, Вы писали:
E>vector<bool> можно, но то ли для оптимизации размещения элементов, то ли еще для чего-то, в поставляемой STL должна быть предусмотрена специализация класса vector для элементов типа bool.
E>Вот несколько выдержек из стандарта:
E>
E>23.2.4 Class template vector [lib.vector]
E>1 A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized) constant time
E>insert and erase operations at the end; insert and erase in the middle take linear time. Storage management is handled
E>automatically, though hints can be given to improve efficiency. The elements of a vector are stored contiguously,
E>meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n]
E>== &v[0] + n for all 0 <= n < v.size().
E>
Вопрос к Степанову: почему нельзя было просто завести класс bool_vector с нужными характеристиками?... Загадка.
Здравствуйте, Jonathan, Вы писали:
J>>>в задании небыло указано должен код соответствовать стандарту или нет. J>>>было только: "Напишите компелябельный код для вызова чистовиртуальной функции" J>>>Что я с успехом и продемонстрировал
S>>Настолько Вы со мной несогласны, что даже в виде минуса выразили, чтож, не поленитесь, S>>гляньте сюда Что такое ill-formed код ? ill-formed == UB ?
Блин. Не хотел писать, дабы не вдаваться в непонятную дискуссию, больше на эту тематику — не отвечаю.
В задании, как Вы процитировали написано:
Напишите компелябельный код для вызова чистовиртуальной функции
ТОт код, который привели вы — ill-formed, далее я дал ссылку на то, что ill-formed код — не является компилябельным, с одним исключением — нарушение ODR — может не диагностироваться компилятором.
Резюмируем:
Ваш код не соответсвует условию задачи — он не копилябельный.
Здравствуйте, Centaur, Вы писали:
C>У нас просили решить несколько задачек.
C>Задачка первая: есть строка, её надо извернуть задом наперёд, не выделяя много дополнительной памяти. Смотреть на то, какой тип/класс претендент использует для строки; решает через индексы, указатели или итераторы; как делает swap. Грамотный программист на C++ должен в первую очередь сказать «std::reverse» и приступить к решению только тогда, когда ему скажут, что «+1, но мы хотим посмотреть, как Вы реализуете аналогичный алгоритм»
C>Задачка вторая: даны два множества целых чисел, представлены сортированными массивами. Найти их объединение (вариант: пересечение), в том же представлении.
можно поинтересоваться, как бы Вы оценили вот такие решения ваших задач ?
я позволил себе опустить некоторые проверки при решении.
1) реверс с указателями
char * str_reverse( char * str )
{
char temp = 0;
char * b = str, * e = str + strlen( str ) - 1;
while( b <= e )
//std::swap( *b++, *e-- ); // самый очевидный вариант для меня
//(*b++ = ( temp = *b, *e )), *e-- = temp; // за такое наверно можно и по шее схлопотать =)
{
temp = *b;
*b++ = *e;
*e-- = temp;
}
return str;
}
void test_str_reverse()
{
char str[] = {"hello world !"};
std::cout << str << std::endl;
std::cout << str_reverse( str ) << std::endl;
}
2) пересечение массивов через указатели. предполагал, что отсортированы по возрастанию, возможно с повторяющимися элементами.
для простоты предполагал, что массивы одной длинны. обьединение у меня получилось еще более наивной и громоздкой, потому не стал показывать.
template < int size >
void print_array( int (&array)[size], int print_size = size )
{
for( int ii = 0; ii < print_size; ++ii )
std::cout << array[ii] << " ";
std::cout << "\n";
}
void arrays_intr( const int *ar1, const int *ar2, int *res, const int size, int *res_size )
{
const int *ar1_end = ar1 + size, *ar2_end = ar2 + size;
*res_size = 0;
while( ar1 < ar1_end && ar2 < ar2_end )
{
if ( *ar1 == *ar2 )
{
if ( (*res_size) == 0 || *(res - 1) != *ar1 )
{
*res++ = *ar1;
++(*res_size);
}
++ar1;
++ar2;
}
else
{
*ar1 > *ar2 ? ++ar2 : ++ar1;
}
}
}
void test_arrays()
{
int ar1[] = { 1, 2, 3, 5, 5, 71 };
int ar2[] = { 0, 1, 2, 3, 4, 5 };
const int size = sizeof( ar1 ) / sizeof( ar1[0] );
int res_intr[ size ] = {0};
int res_size = 0;
print_array( ar1 );
print_array( ar2 );
arrays_intr( ar1, ar2, res_intr, size, &res_size );
print_array( res_intr, res_size );
}
да, и сколько времени Вы бы дали на решение задач ?