如何在迭代它时从std :: set中删除元素

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)