Является ли итератор недействительным? - PullRequest
1 голос
/ 06 июня 2010

Является ли итератор недействительным после:

string b "Some string";
auto beg_ = b.begin();
auto end_ = b.end();
b.erase(beg_);

Ответы [ 4 ]

5 голосов
/ 06 июня 2010

Да, но erase возвращает действительный итератор, который можно использовать для продолжения цикла:

Для остальных членов функция возвращает итератор члена тип string :: iterator со ссылкой на персонаж, который сейчас занимает позиция первого персонажа Стерли, или, если нет такого персонажа существует, возвращает end ().

Источник: http://www.cplusplus.com/reference/string/string/erase/

1 голос
/ 06 июня 2010

Из того, что я понимаю, да. Операции удаления и вставки делают недействительными итераторы.

Но erase (итератор) также возвращает итератор, который вы можете использовать.

1 голос
/ 06 июня 2010

Да

http://www.sgi.com/tech/stl/basic_string.html

Итераторы могут быть аннулированы путем замены, резервирования, вставки и удаления (а также функциями, эквивалентными вставке и / или удалению, напримеркак очистить, изменить размер, добавить и заменить).Кроме того, однако, первый вызов любой неконстантной функции-члена, включая неконстантную версию begin () или operator [], может сделать недействительными итераторы.

1 голос
/ 06 июня 2010

Да, Стандарт говорит

Ссылки, указатели и итераторы, ссылающиеся на элементы последовательности basic_string, могут быть признаны недействительными следующими объектами basic_string:

  • Вызов неконстантных функций-членов, кроме operator[](), at(), begin(), rbegin(), end() и rend().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...