Стирание элемента из контейнера внутри цикла for на основе диапазона - PullRequest
10 голосов
/ 24 декабря 2011

Я хочу стереть элемент из контейнера, который в настоящее время используется в циклическом цикле for. Это приведет к неопределенному поведению? Или следующее значение element после erase() будет таким, каким должен быть следующий элемент, если я не вызвал erase()?

Пример:

std::map<int, int> someMap;
/* Fill in someMap */
for (auto& element : someMap)
{
    /* ... */
    if ( /* Some condition */ )
        someMap.erase(element.first);
}

1 Ответ

12 голосов
/ 24 декабря 2011

Это должно быть неопределенное поведение. Поскольку в соответствии с 14882/2011 диапазон для оператора for эквивалентен:

auto && __range = range-init;
for ( auto __begin = begin-expr(__range),
   __end = end-expr(__range);
   __begin != __end;
   ++__begin ) {
   for-range-declaration = *__begin;
   statement
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...