Может ли итератор 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 выдаст утверждение отладки во время выполнения (из-за его проверяемые итераторы) Если вы делаете это.