我们可以在c ++ 11中擦除基于范围的for循环中的项目

Zhi*_*ang 7 c++ c++11

我想删除所有项目少于vC++ 11标准容器set,这是我的代码:

void delete_less_than(set<int> & ss, int const v) {
   for (auto item: ss) {
      if (item < v) {
        ss.erase(ss.find(item));
      } else break;
  }  
}
Run Code Online (Sandbox Code Playgroud)

代码是否正常工作?我在我的计算机上似乎没问题(g ++ 4.7.3),但在我提交代码的一些在线判断中无限循环.

Ker*_* SB 24

这不是基于范围的循环.不要用它; for改为使用普通循环.基于范围的版本仅在您想要对容器中的每个元素执行某些操作时,而不会改变容器.

for (auto it = ss.begin(); it != ss.end(); )
{
    if (*it < v) { ss.erase(it++); }
    else         { ++it;           }
}
Run Code Online (Sandbox Code Playgroud)

更简单:

ss.erase(ss.begin(), ss.lower_bound(v));
Run Code Online (Sandbox Code Playgroud)

  • @notbad:它未定义.该标准定义了基于范围的等效代码.该代码使用迭代器,它使用的迭代器由`erase`无效. (2认同)
  • 哦,那个`lower_bound`解决方案很性感! (2认同)
  • @anthrond:`erase(it ++)`很好; `擦除(它); ++ it;`不好,因为`erase`使迭代器无效. (2认同)
  • `ss.erase(it++);` 很聪明,但是依赖前/后增量语义会给未来的维护者带来麻烦。`erase` 返回下一个迭代器,因此通常推荐的解决方案是 `it = ss.erase(it);` (2认同)