wzrd писал(а): ↑03.02.2008 15:19
за перебор я вам могу только похлопать. интересно. я вас не проверяю на умение решать задачи я просто приводил то с чем сталкивался.
string: были случаи когда изменение string'a на указатели давала лучшее время, что было критично.
Задача тут.(ее можно и без строк конечно, но я про способ со строками.
извините если запарил со своими задачами, просто так легче
я исвлек вывод что если заниматься олимпиадами то STL пользоваться не желательно, а с другой стороны это неплохая помощь при разработке. я выложу вам исходник первой задачи когда перепишу (нужно сортировку поменять, я пузырьком делал).
Угу, вот и разобрались. Вы смотрите на STL с точки зрения его применения в олимпиадных задачках. Это совсем другое дело, но надо понимать, что олимпиадные задачи от реальных отличаются, и методы их решения тоже отличаются. На работе я могу три часа чай пить, обдумывая то, что надо сделать, а на олимпиаде кажая минута на счету (помните ведь, как в последние минуты судорожно пытаешься дописать задачу?). На работе мой код будут дописывать, модифицировать, искать в нём баги мои коллеги, на протяжении нескольких лет после его создания, на олимпиаде код никому не нужен, никому не нужны комментарии и осмысленные названия переменных. На олимпиаде важно написать задачу здесь и сейчас, на работе важно писать код, который будет расширяемым. На олимпиаде код тестируется на коленке, на работе я пишу юниттесты, тщательно покрывающие код.
Примерно по этим причинам я и считаю, что опыт решения олимпиадных задач к реальным задачам имеет мало отношения.
Относительно С++ в олимпиадах могу сказать следующее. Я лично олимпиадные задачки решал на паскале (потому что тогда ещё не знал С++), поэтому ниже только мои рассуждения:
iostreams - удобная штука, но медленная. Если надо считать 4 числа, вычислить что то и записать 4 числа, она вполне удобна. Если надо записать миллион чисел, лучше stdio.h.
STL-евские структуры данных - массивы, списки, деревья - довольно эффективны. Рукописныые их могут побить примерно в полтора раза, и то далеко не всегда. Зато в них нет ошибок, а в рукописных списках нередко путаешь указатели или забываешь про какую-нибудь глупость, и потом отлаживаешь минут 10 (а в олимпиаде 10 минут это много). Учитывая то, что грамотный алгоритм куда важнее ручных оптимизаций, я бы их использовал. Я уже не говорю о том, что написать нормальное дерево с балансировкой за полчаса действительно не так просто. А готовое STL-евское использовать - без проблем.
строки - фактически массив символов. Соотвественно у них такая же эффективность.
STL-евские алгоритмы, в большинстве своём, в олимпиадах не нужны. Исключения - std::sort, и ещё парочка наиболее часто употребляемых. Всё равно приходится всё писать руками.
Я лично написал не один класс вектора или списка на С++. И могу сказать, что STL-евские векторы и списки написаны довольно хорошо. Единственное НО - их нужно уметь использовать, понимать, почему ++i лучше i++, где может вызваться конструктор копирования, почему параметры надо передавать по ссылкам. Но когда всем этим владеешь, проблем особых возникать не должно.