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

Can we erase the items in range-based for loop in c++11

本文关键字:循环 范围内 项目 于循环 擦除 c++11 我们      更新时间:2023-10-16

我想擦除C++11标准容器set中所有小于v的项目,这是我的代码:

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

代码能正常工作吗?我在我的电脑上看起来不错(g++4.7.3),但在我提交代码的某个在线判断上无限循环。

这不是基于范围的循环的用途。不要使用它;而是使用普通的CCD_ 3循环。只有当您想对容器中的每个元素执行某些操作时,才可以使用基于范围的版本,而不更改容器

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

更简单:

ss.erase(ss.begin(), ss.lower_bound(v));