Блог пользователя Morgan_HackProg

Автор Morgan_HackProg, 12 лет назад, По-русски

Недавно меня заинтересовал вопрос — насколько полезны шаблоны, которые каждый раз копируются в тело программы. Актуален ли этот вопрос только для С/С++? Действительно ли это кардинально экономит время? Подскажите хороший, опробованный шаблон для С++.

  • Проголосовать: нравится
  • +6
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится +10 Проголосовать: не нравится

Думаю, использовать сложные шаблоны или нет — это решение каждого. Я одно время пытался пользоваться чужим шаблоном с кучей дефайнов и тайпдефов, но эффективности мне это не прибавило. В итоге, со временем, я сформировал свой собственный минималистичный шаблон, который использую и на онсайт соревнованиях.

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

Есть, однако, некоторые вещи, которые я предпочитаю держать в голове, а не в шаблоне, например простые процедуры: binpow, gcd, bitcount, get_primes. Вещи тривиальные, но лучше я напишу это лишний раз на тренировке, чем потом посажу багу на онсайте.

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +6 Проголосовать: не нравится

Отвечу на более общий вопрос: prewritten code (написанный перед контестом) действительно очень экономит время — не требуется в тысячный раз что-то набивать, алгоритм или шаблон. Поэтому подходит в том числе и для Pascal, и для Java (например, в последней в шаблон можно включить быстрый читальщик на BufferedReader).

Лично я использую только шаблон, а всё остальное пишу каждый раз с нуля, вопрос идеологический. Что же до "опробованного", то лучше написать самостоятельно — будет всё нужное Вам лично и не будет ничего лишнего. Можете, например, начать с подключения всех регулярно нужных #include и int main(). Если на контесте что-то понадобилось — добавляете в него. Так накопится нужный функционал.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Я пишу на паскале, и шаблон у меня есть, правда, короткий — объявление трёх полезных модулей и «переименовывание» трёх основных типов — longint в int, extended в ex и boolean в bool. Вряд ли это кардинально экономит время, но мне так действительно быстрее и проще. Особенно с int-ом.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Кардинально ли экономит время? Зависит от того насколько разный код пишите, т.е. что чаще используете, а что как придется. Например, используете long long почти в каждой программе почему бы не сократить до того же ll. Или например for ( int i = 0; i < n; i++ ) до FOR(i,n).

Обычно в шаблоны нужно добавлять только те вещи, которые просто долги по написанию синтаксиса, но просты в понимании. По-моему не стоит добавлять туда пи-функцию, поиск, НОД и т.д. А то на контесте без шаблона можно словить баг.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Сам всегда пользуюсь шаблоном: лень писать простыню инклудов, там же добавлены частоиспользуемые тайпдефы. Кроме того, для того, чтобы постоянно не видеть ввод/вывод/return 0/обработку мультитеста/вывод времени работы и пр. написан main(), который занимается всем неинтеллектуальным и вызывает solve() в уоторой собственно решение.

Не думаю, что это кардинально экономит время, но экономит. А главное — позволяет сделать напсиание контеста более приятным.

Рекомендую написать свой шаблон. Во-первых, это позволит иметь там то, что вам нужно, а не то, что кто-то написал. Во-вторых, это не нарушает правила некоторых соревнований(в отличие от копипаста)

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Есть возможность навешать полезностей не только в шапку шаблона. Можно изменить ключи компиляции в настройках среды. Например, я повесил на две кнопки немножко разные ключи. Вот пример штуки, которую я повесил на F8:

g++ -D DEBUG -D LOCAL -O2 -Wall /*Имя файла*/

Чем это удобно. Можно не зависеть от платформы, на которую ты посылаешь код, чтобы настраивать файловый ввод — вывод:

#ifndef LOCAL
  freopen("in", "r", stdin);
  freopen("out", "w", stdout);
#endif

Так же ко всему определена переменная DEBUG, что позволит делать дебаговый вывод там, где нужно, вот таким способом:

#ifdef DEBUG
  //some code
#endif

Соответственно на другую кнопку(F9) я повесил то же самое, только без дебага

g++ -D LOCAL -O2 -Wall /*Имя файла*/ 

P.S. Если не понятно, что такое -D DEBUG, то это равнозначно #define DEBUG внутри кода. Ведь так гораздо удобнее, чем комментить эту строку в своем коде, когда она не нужна.

P.P.S. Использую Geany под Linux, там все это дело настраивается очень просто.