C++ 我们是否可以删除c+;中基于范围的for循环中的项目+;11
我想删除C++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){ 用于(自动
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));