Здравствуй, Сообщество Codeforces! Я довольно-таки часто сталкиваюсь с проблемой: ловлю СЕ, когда на компе все нормально. Этот СЕ связан с СТЛ, а точнее с algorithm. Я не знаю как, но когда я подключаю string или vector некоторые функции (sort, reverse) включаются автоматически. Использую я Far + mingw. Ну естественно, без алгоритма у меня все компилится, я отправляю, а на сервере — СЕ. То есть потеря времени. Кто знает как решить эту проблему (м.б. какие-нибудь параметря компилятору надо передавать?). Я начал использовать заготовки, куда все инклудил, но иногда кажется проще без них. Заранее благодарен всем, кто ответит.
#include <algorithm>
Мне кажется, или это самое простое решение?кажется
Почему?
ну во-первых это как-то грубо, что ли, иногда он не нужен, зачем его подключать, да и к тому же, кроме algorithm могут с какой-то другой библиотекой проблемы возникнуть, например, я знаю, что такой же прикол с cstdio, без нее scanf/printf норм локально работают
Там ровно та же проблема, что и с algorithm. Старая версия g++ подключает его через что-то еще, а новая нет.
ну я о чем и говорю, что algorithm подключишь, все проблемы с библиотеками не решишь, когда-нибудь нарвешься еще на что-нибудь, логичнее уж компилятор более новый скачать
Для каждого заголовочного файла определено стандартом, какие вещи в него входят. Где что объявлено/определено, можно посмотреть, например, здесь: http://cplusplus.com/ или http://cppreference.com/ Возможно, что некоторые файлы в некоторых реализациях стандартной библиотеки включают, кроме обязательного списка, что-то ещё, однако это не означает, что так будет всегда и везде, и на это нельзя полагаться.
Общее правило такое: для каждой использованной функции или класса надо явно включать тот файл, где они объявлены. Поэтому надо либо запомнить, какие файлы включать для каждой функции/класса, либо сделать шаблон, который включает все стандартные файлы, которые могут потребоваться.
sort()
иreverse()
по стандарту определены в<algorithm>
, а не в<string>
, поэтому и для их использования надо включать<algorithm>
, а не<string>
.По-моему стандартом это не определяется. Если ошибаюсь, можно ссылку на соответсвующий пункт оттуда?
ISO/IEC 14882
Описание стандарта Стр:465,543
Это про функции что ли? Я подумал, что речь идет про то, где какие include включаются :)
Там и это есть
Можно показать пальцем точный пункт? В упор не вижу ни в одном стандарте :)
Ещё можно для простоты поставить себе ту же версию MinGW, что и на сервере.
Тут написано, что на настоящий момент это GCC 4.6.1.
Его можно найти, например, здесь.
Большое спасибо за помощь. Про сайты где что объявлено я знал. Прост иногда с спешке включить можно и забыть. А вот насчет версии GCC — походу надо будет его обновить. Вопрос — а где можно узнать его версию?
Командой
g++ -v
в командной строкеМдеее старье у меня оказывается стояло... 3.4.5 версии компилятор был(((
Ух ты. А что такое -pedantic?
Ну как же, http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-pedantic-253
IMO,
-pedantic
в олимпиадном программировании не очень помогает (разве что если на сервере совсем другой компилятор), не говоря уже о-Werror
, который скорее мешает. Из параметров GCC гораздо полезнее-Wextra
.Ну
-Wall -Wextra -Werror
у меня стоит всегда. Но-pedantic
это уже совсем жесть. Он наlong long
ругается, потому что его в каком-то старом стандарте нет. Как тогда получается правильно писать?Добавить либо
-Wno-long-long
, либо-std=c++0x
/-std=c++11
.-pedantic
почти не использую, на случай если на сервере стоит какая-нибудь совсем шаманская версия компилятораделай
#include <queue>
оно подключает algorithm и vectorу меня товарищ о колическве инклудов заморачивался и подобрал методом научного тыка (и изучением хидеров) некоторое множество которого достаточно для всех компилеров и его стандартных штучек, там точно присутствовал
queue
я же это проблемой не считаю и всегда включаю 100500 хидеров set/map/list/stack/queue/algorithm и т.д и т.п., хотя list например использовал всего пару раз за всю жизнь.
Проблема исправлена: скачал новый компилятор. Оказывается со старым компилятором были подобные вещи, но я их не замечал. Например: freopen, насколько я знаю, определен в cstdio, и со старым компилятором, проблем не было, когда я подключал только iostream. Теперь же новый начал ругаться, что freopen, stdin не определены)))