Если вы хотите, чтобы 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. Нередко это критично с точки зрения скорости.