нужен совет программистов!
// function template II
#include <iostream>
using namespace std;
template <class T>
T GetMax (T a, T b) {
return (a>b?a:b);
}
int main () {
int i=5, j=6, k;
long l=10, m=5, n;
k=GetMax(i,j);
n=GetMax(l,m);
cout << k << endl;
cout << n << endl;
return 0;
} takoe mne legce ponjatj.,teper ja znaju cto takoe template.
Это одно из применений шаблонов, да. Мы избегаем повторного написания функции для всех типов , которые мы используем. Вместо этого мы пишем одну шаблонную функцию, а компайлер за нас инстанциирует (то бишь генерирует) эту функцию для используемых нами типов.
Ещё одно использование - параметризация функции. Пример (здесь мы с помощью шаблона параметризуем размер используемого массива):
template< size_t N > // optimal N = 16-128K std::string load_file( const char* filename ) { std::ifstream ifs( filename, std::ios::binary | std::ios::in ); std::tr1::array< char, N > buffer; std::string s; ifs.seekg( 0, std::ios::end ); s.reserve( ifs.tellg() ); ifs.seekg( 0 ); while( ifs ) { ifs.read( buffer.data(), buffer.size() ); s.append( buffer.data(), ifs.gcount() ); } return s; }
Ещё одно использование - вывод типов, но это такие дебри куда новичку лучше не лезть. В С++ отсутствует рефлексия, поэтому шаблонами злоупотребили для получения разной информации о типах... Более того, даже целый парсер-генератор накатали на шаблонах. Это прикольно, но тоже не для новичков.
А что касается алгоритмов, вот есть хорошая книжка по соревновательному программированию, там рассмотрены большинство существующих алгоритмов http://vandoren.strana.germany.ru/cp3.pdf
Так и джаве можно без генериков обойтись
вы имеете ввиду без создания своих, или без использования? если второе, то очень вряд ли : )
Шаблоны - это такой же инструмент, как и остальные фичи языка
нет, здесь я не согласен.
и если он облегчает жизнь, его надо использовать.
, и нужно добавить ", а если усложняет - то поотрывать руки тому, кто использует".
я вспоминаю, как работал в одной фирме с очень успешным и всемирно распространенным продуктом. так вот один из ведущих специалистов (считался экспертом на фирме по с++, вот прямо как Ван Дам), так он свой класс "динамический вектор" или что-то такое написал (и это было интегрировано в продукт!), и все только потому, что ему не нравился std::vector, у него часто возникали прерывания в коде самого темплейта, а разбираться в реализации (посмотрите одну из здесь https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a01...) ему не хотелось. а товарищ хотел ясно понимать (и чтобы все понимали), что у него происходит. вот бы их с Ван Дамом свести, они
бы наверняка подружились : )
В каком смысле верю? Вы про интервью 20-летней давности? Это в айти вечность, ничто из этого не имеет сегодня значения в любом случае.
Вы какой-то бред тут несете. В принципе, насколько нужны свои шаблоны сильно зависит от типа программы. В любом случае, общие use cases встречаются достаточно часто, и они должны решаться шаблонами. Я лично использовал очень сложное метапрограммирование на шаблонах в универе для написания базы данных, ибо альтернативой были бы тонны кода. Мои шаблоны свели пользовательский код до коротеньких элегантных функторов. Там же я сделал стримы-итераторы на шаблонах, где до этого без пяти минут доктора информатики писали ужасный километровый код. Как и во всем - надо знать, где и когда их применять. А переписывать стандартную библиотеку в любом случае маразм.
Ещё вопрос:Вы сказали, с++ очень узко используется.В каких именно? Где на практике,для чего?
Можете сами полистать. https://www.gulp.de/gulp2/projekte/suche?0&scope=projects&...
В основном имхо embedded. Или вот ещё https://stackoverflow.com/jobs?sort=y&q=c++&l=Germany&...
> Скажите,Van Doren, вы верите(или отчасти),в то что было указано в статье Ilghiz?
вообще ходит мнение, что Страустрап такое не говорил, но первого января и не такое можно было сказать :)
Я лично считаю, что если пользоваться С++ адекватно и с жесткой цензурой, то получается очень аккуратно написанный и читаемый код, но если в команде много говнокодеров и руководство проекта не контролирует разработку, то получается так, что проект пишется и поддерживается только той же командой, которая это и писала.
Расскажу забавную историю. В 1993 году зная и, уже много используя С++, пришел в фирму устраиваться на работу. Далее Ш - шеф, Я - это я.
Ш: у нас все на фортране,
Я: фу, это старый язык, я знаю С++,
Ш: мне надо пермутировать 7-мерный массив, если твоя программа на С++ будет работать хотя бы также быстро, как моя на фортране и поместится хотя бы в 20 строк, то ты будешь писать на С++, иначе - переучиваешься.
Итого: да, я переучился и стал писать на фортране, так как фортрановская версия была раз так 10 быстрее, и в 3 раза короче по числу строк и конечно же прозрачнее в восприятии.
То, что было в фортране в 70-ых и появилось с стандарте С 99 года, наконец-то появилось с С++ только в 14 стандарте (2014), до этого работать адекватно с разбивкой куска памяти на многомерный массив можно было или через какое-то место (то бишь указатели на указатели) в ущерб производительности, или разрисовывая индексы вручную.
То есть я к
чему, и на С, и даже на ООП Фортране можно писать большие и успешные программы. На С++ очень много возможностей и нужен внутренний стержень, чтоб не стать говнокодером, чтоб потом вами написанный код никто не смог прочитать и поддерживать. В то же время, современный С++ 14 стандарта позволяет ИМХО писать наиболее лаконичные, читаемые, и одновременно наиболее оптимальные с точки зрения производительности программы.
вы имеете ввиду без создания своих, или без использования? если второе, то очень вряд ли : )
Как, так и.
Например, я сижу на легаси-проекте, в котором никаких генериков не было до моего прихода.
А я постоянно пишу классы с генериками для своих нужд. И на С++ писал (причем не тривиальные, а с выведением типов, если я правильно понимаю термин), на что у коллег начинался лютый батхерт, потому что как с++ они толком не знали и разбираться не хотели - мол, и так сойдет. В их понимании я усложнял, а я считал, что упрощал.
если в команде много говнокодеров и руководство проекта не контролирует разработку, то получается так, что проект пишется и поддерживается только той же командой, которая это и писала.
Вот в такое я и вляпался в своей второй фирме. Пришел 2 января в офис, открыл код и чуть не ох...л. Носителей ноухау уже давно не было, и слава богу - убил бы :-D Хорошая школа жизни оказалась. Квинтэссенция - "я могу все".
В теперешней примерно то же получилось с джава-проектом, но джава - это джава, тулзы на порядок лучше.
Носителей ноухау уже давно не было, и слава богу - убил бы :-D
«Всегда кодируй так, будто парень, который будет поддерживать твой код — необузданный психопат, и он знает, где ты живёшь» 🤣
Мы хоть и одного с Вами возраста, но разве уже на "ты"? Я очень даже "милых дам" приветствую в IT. У меня самого дочки - 9 и 11 лет - этим делом очень даже интересуются. Именно в этом возрасте надо детей учить программировать на С. Вот в декабре - дочки командно выиграли 2 диплом по Германии по информатике в хаупт-лиге, это где и оберштуфа участвует. Задачки они решали именно на языке С, хотя организаторы олимпиады рекомендуют решать на жабе с питоном - и вместо тысяч строк на этом говнокоде, как у многих, получилось по 40 строк на задачку на С - и 2 место в хаупт-лиге плюс приглашение на воркшоп по ИИ в феврале. Поэтому хоть и мозги у женщин больше к параллелизму склонны, лучше бы поторопиться, ведь молодняк скоро на пятки будет наступать.
хотя организаторы олимпиады рекомендуют решать на жабе с питоном - и вместо тысяч строк на этом говнокоде
На питоне как раз часто можно очень компактный код писать. Хотя я всегда пишу соревновательные задачи на С++. Вот пример для питона: https://code.google.com/codejam/contest/8294486/dashboard#...
решение на питоне:
def solve(N,R,O,Y,G,B,V): if max(R,Y,B) > sum([R,Y,B])-max(R,Y,B): return "IMPOSSIBLE" if R==max(R,Y,B): return "RYB"*(Y+B-R)+"RY"*(R-B)+"RB"*(R-Y) if Y==max(R,Y,B): return "YRB"*(R+B-Y)+"YR"*(Y-B)+"YB"*(Y-R) if B==max(R,Y,B): return "BRY"*(Y+R-B)+"BR"*(B-Y)+"BY"*(B-R) testcase = input() for i in range(testcase): N,R,O,Y,G,B,V = map(int,raw_input().split()) print "Case #"+str(i+1)+":",solve(N,R,O,Y,G,B,V)
Ни в коем случае не хотела умолить Ваших достоинств.По старой итальянской привычке вырвалось:там не принято на Вы,кто жил много лет в Италии может подтвердить.Приехав сюда,не раз приходилось краснеть. Ещё раз sorry...
P.s почему-то мне показалось что Вы совсем ещё юный парень...