dsp*_*pyz 10 c++ stl coding-style set
如何从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--);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我们想要从集合中删除第一个元素,那么这是有问题的,因为iter--迭代器无效.
这样做的标准方法是什么?
For*_*veR 17
标准的方法是做类似的事情
for(set<T>::iterator iter = s.begin(); iter != s.end();)
{
if(/*some condition*/)
{
s.erase(iter++);
}
else
{
++iter;
}
}
Run Code Online (Sandbox Code Playgroud)
根据我们确定的第一个条件,iter无论如何都不会失效,因为副本iter将被传递到erase中,但是iter在调用erase之前我们已经递增了.
在C++ 11中,代码就像
for(set<T>::iterator iter = s.begin(); iter != s.end();)
{
if(/*some condition*/)
{
iter = s.erase(iter);
}
else
{
++iter;
}
}
Run Code Online (Sandbox Code Playgroud)