Недавно меня заинтересовал вопрос — насколько полезны шаблоны, которые каждый раз копируются в тело программы. Актуален ли этот вопрос только для С/С++? Действительно ли это кардинально экономит время? Подскажите хороший, опробованный шаблон для С++.
Думаю, использовать сложные шаблоны или нет — это решение каждого. Я одно время пытался пользоваться чужим шаблоном с кучей дефайнов и тайпдефов, но эффективности мне это не прибавило. В итоге, со временем, я сформировал свой собственный минималистичный шаблон, который использую и на онсайт соревнованиях.
Короче говоря, совет можно дать такой: если ты что-то очень часто используешь и не видишь смысла каждый раз набирать это заново, добавляй в свой шаблон. Как минимум, это инклуды и т. п.
Есть, однако, некоторые вещи, которые я предпочитаю держать в голове, а не в шаблоне, например простые процедуры: binpow, gcd, bitcount, get_primes. Вещи тривиальные, но лучше я напишу это лишний раз на тренировке, чем потом посажу багу на онсайте.
Отвечу на более общий вопрос: prewritten code (написанный перед контестом) действительно очень экономит время — не требуется в тысячный раз что-то набивать, алгоритм или шаблон. Поэтому подходит в том числе и для Pascal, и для Java (например, в последней в шаблон можно включить быстрый читальщик на BufferedReader).
Лично я использую только шаблон, а всё остальное пишу каждый раз с нуля, вопрос идеологический. Что же до "опробованного", то лучше написать самостоятельно — будет всё нужное Вам лично и не будет ничего лишнего. Можете, например, начать с подключения всех регулярно нужных
#include
иint main()
. Если на контесте что-то понадобилось — добавляете в него. Так накопится нужный функционал.Я пишу на паскале, и шаблон у меня есть, правда, короткий — объявление трёх полезных модулей и «переименовывание» трёх основных типов — longint в int, extended в ex и boolean в bool. Вряд ли это кардинально экономит время, но мне так действительно быстрее и проще. Особенно с int-ом.
Кардинально ли экономит время? Зависит от того насколько разный код пишите, т.е. что чаще используете, а что как придется. Например, используете
long long
почти в каждой программе почему бы не сократить до того жеll
. Или напримерfor ( int i = 0; i < n; i++ )
доFOR(i,n)
.Обычно в шаблоны нужно добавлять только те вещи, которые просто долги по написанию синтаксиса, но просты в понимании. По-моему не стоит добавлять туда пи-функцию, поиск, НОД и т.д. А то на контесте без шаблона можно словить баг.
Сам всегда пользуюсь шаблоном: лень писать простыню инклудов, там же добавлены частоиспользуемые тайпдефы. Кроме того, для того, чтобы постоянно не видеть ввод/вывод/return 0/обработку мультитеста/вывод времени работы и пр. написан main(), который занимается всем неинтеллектуальным и вызывает solve() в уоторой собственно решение.
Не думаю, что это кардинально экономит время, но экономит. А главное — позволяет сделать напсиание контеста более приятным.
Рекомендую написать свой шаблон. Во-первых, это позволит иметь там то, что вам нужно, а не то, что кто-то написал. Во-вторых, это не нарушает правила некоторых соревнований(в отличие от копипаста)
Есть возможность навешать полезностей не только в шапку шаблона. Можно изменить ключи компиляции в настройках среды. Например, я повесил на две кнопки немножко разные ключи. Вот пример штуки, которую я повесил на F8:
Чем это удобно. Можно не зависеть от платформы, на которую ты посылаешь код, чтобы настраивать файловый ввод — вывод:
Так же ко всему определена переменная DEBUG, что позволит делать дебаговый вывод там, где нужно, вот таким способом:
Соответственно на другую кнопку(F9) я повесил то же самое, только без дебага
P.S. Если не понятно, что такое
-D DEBUG
, то это равнозначно#define DEBUG
внутри кода. Ведь так гораздо удобнее, чем комментить эту строку в своем коде, когда она не нужна.P.P.S. Использую Geany под Linux, там все это дело настраивается очень просто.