Может ли итератор STL map выйти за пределы приращения?

для ассоциативных контейнеров оператор ++ может отправить итератор за конец коллекции?

пример:

map<UINT32, UINT32> new_map;
new_map[0] = 0;
new_map[1] = 1;

map<UINT32, UINT32> new_iter = new_map.begin();

++new_iter;
++new_iter;
++new_iter;
++new_iter;
++new_iter;
++new_iter;
++new_iter;

в конце этого, делает new_iter == new_map.end (), или он заканчивается в Великом неизвестном?

примечание: Я знаю, что это испорчено, а не способ делать вещи. Я работаю над корпоративным кодексом WTF.

3 ответов


Если вы увеличиваете конечный итератор, результатом является неопределенное поведение. Таким образом, это может остаться конец, или сойти с конца, или отправить вашей бабушке ссылку на goatse.

Читайте также: Что делать, если я увеличу итератор на 2, когда он указывает на последний элемент вектора?


предварительным условием оператора ++ для прямого итератора является разыменование итератора. Это означает, что он не может быть за пределами конца карты, поэтому ваш код дает неопределенное поведение. Это описано в разделе 24.1.3 стандарта C++.


как указывали другие, увеличение конечного итератора вызывает неопределенное поведение, однако стоит отметить, что Visual Studio 2008 выдаст утверждение отладки во время выполнения (из-за его проверяемые итераторы) Если вы делаете это.