Может ли итератор карты STL выйти за пределы за счет приращения? - PullRequest
7 голосов
/ 25 августа 2009

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

Пример:

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 ]

27 голосов
/ 25 августа 2009

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

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

11 голосов
/ 25 августа 2009

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

5 голосов
/ 25 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...