在基于范围的for循环中从容器中删除元素

Erasing an element from a container while inside a range-based for loop

本文关键字:循环 元素 删除 for 于范围 范围      更新时间:2023-10-16

我想从容器中删除一个元素,该元素当前正在基于范围的for循环中使用。这会导致未定义行为吗?或者erase()之后element的下一个值是我不调用erase()时下一个元素的值吗?

的例子:

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

应该是一个未定义的行为。因为根据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
}