ilyaraz's blog

By ilyaraz, 13 years ago, In Russian

Если вы хотите, чтобы 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(). Это решение более хорошее по двум причинам:

  1. Во-первых, оно более гибкое. Например, вместо at() можно оставить operator[], но перед его вызовом сделать ручную проверку и вывести ее результат куда-нибудь на cerr.
  2. Во-вторых, проверка включается только в векторе, а не во всем STL. Нередко это критично с точки зрения скорости.
  • Vote: I like it
  • +30
  • Vote: I do not like it