【问题标题】:Erasing an element from a container while inside a range-based for loop在基于范围的 for 循环内从容器中擦除元素
【发布时间】:2011-12-24 13:01:22
【问题描述】:

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

例子:

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

【问题讨论】:

    标签: c++ for-loop c++11


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 1970-01-01
      • 2015-09-28
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2014-02-08
      • 1970-01-01
      相关资源
      最近更新 更多