C++ 我们是否可以删除c+;中基于范围的for循环中的项目+;11

C++ 我们是否可以删除c+;中基于范围的for循环中的项目+;11,c++,c++11,C++,C++11,我想删除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; } } void delete_小于(set&ss,int const v){ 用于(自动

我想删除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;
  }  
}
void delete_小于(set&ss,int const v){
用于(自动项目:ss){
如果(第五项){
ss.擦除(ss.查找(项目));
}否则就断了;
}  
}

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

这不是基于范围的循环的用途。不要使用它;改为使用正常的
循环。仅当您希望对容器中的每个元素执行某些操作而不改变容器时,才使用基于范围的版本


@不错:还没有定义。该标准定义了基于范围的代码。那段代码使用了迭代器,它使用的迭代器被
擦除
无效。哦,那
下限
解决方案很性感!我担心是否
ss.erase(it++)使
迭代器无效。可以吗,因为在调用
ss.erase()
之前,
it++
的副作用会增加
it
,因此增量后的
++
仍然在有效迭代器上运行(并且因为在std::set::erase()之后,对未擦除元素的迭代器仍然有效)?因此,将交换为两个语句,
ss.erase(it)++它然后是否使用了无效的迭代器?依赖这样一个细微的区别是否会影响清晰性或可维护性?@anthrond:
erase(it++)
很好<代码>擦除(it)++它
不好,因为
erase
使迭代器无效。
ss.erase(it++)
很聪明,但依赖于增量前/增量后语义会给未来的维护人员带来麻烦
erase
返回下一个迭代器,因此通常推荐的解决方案是
it=ss.erase(it)即使我喜欢的范围,一个很好的例子,说服可能是不好的(假设一些函数调用修改容器的东西)。
for (auto it = ss.begin(); it != ss.end(); )
{
    if (*it < v) { ss.erase(it++); }
    else         { ++it;           }
}
ss.erase(ss.begin(), ss.lower_bound(v));