Если вы хотите, чтобы operator[] (а не только at()) у класса std::vector выполнял проверку на выход за пределы массива, то нужно дописать следующую строчку перед инклюдами (речь идет о g++).
#define _GLIBCXX_DEBUG
Тогда при попытке выйти за пределы массива выдается примерно такое сообщение:
/usr/include/c++/4.4/debug/vector:265:error: attempt to subscript container
with out-of-bounds index 1, but container only holds 1 elements.
Objects involved in the operation:
sequence "this" @ 0x0x7fffe4f2e9f0 {
type = NSt7__debug6vectorIiSaIiEEE;
}
Aborted
По-моему, для олимпиад очень полезная вещь. Java и пр. отдыхают! :)
UPD
Другой способ решения данной проблемы: написать в начале файла что-то типа http://pastebin.com/6HDaceHq . Тогда operator[] просто заменится на at(). Это решение более хорошее по двум причинам:
- Во-первых, оно более гибкое. Например, вместо at() можно оставить operator[], но перед его вызовом сделать ручную проверку и вывести ее результат куда-нибудь на cerr.
- Во-вторых, проверка включается только в векторе, а не во всем STL. Нередко это критично с точки зрения скорости.
Кстати, к сожалению макросы тут необходимы, потому что в c++ нету template typedef.
Ты не совсем прав.
Начиная с 2005 студии в std::vector проверка выхода за границы массива делается по умолчанию. И в дебаге, и в релизе (и даже вместе с NDEBUG), и от оптимизации это никак не зависит. Только ошибка вылетает разная: в дебаге студия выдаёт что-то типа адекватного сообщения (что, где, как), а в релизе просто умирает.
Для того, чтобы отключить данную "фичу", нужно написать в самом начале программы "#define _SECURE_SCL 0". Кстати говоря, если в программе куча обращений к вектору, то такое отключение существенно её ускорит, потому что эти проверки связывают руки оптимизатору.
Особо любопытные могут посмотреть ассемблеровский листинг и увидеть там вызовы процедуры падения: "call __invalid_parameter_noinfo".
Хмм... не понял, что ты имеешь ввиду.
На сервере codeforces я получаю "Ошибка времени исполнения на тесте 1" (разумеется без "_SECURE_SCL 0"). Вызываемая процедура приводит именно к скоропостижной смерти программы, что естественно регистрируется как RE.