如何在迭代时删除std::set
中的元素
我的第一次尝试看起来像:
set<T> s;
for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) {
//Do some stuff
if(/*some condition*/)
s.erase(iter--);
}
但是如果我们想从集合中删除第一个元素,这是有问题的,因为iter--
使迭代器无效。
这样做的标准方法是什么?
答案 0 :(得分:17)
标准方法是做类似
的事情for(set<T>::iterator iter = s.begin(); iter != s.end();)
{
if(/*some condition*/)
{
s.erase(iter++);
}
else
{
++iter;
}
}
根据第一个条件,我们确定iter
无论如何都不会失效,因为iter
的副本将被传递到擦除,但我们的iter
已经递增,之前擦除被称为。
在C ++ 11中,代码就像
for(set<T>::iterator iter = s.begin(); iter != s.end();)
{
if(/*some condition*/)
{
iter = s.erase(iter);
}
else
{
++iter;
}
}