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

时间:2013-12-17 06:31:23

标签: 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--);
}

但是如果我们想从集合中删除第一个元素,这是有问题的,因为iter--使迭代器无效。

这样做的标准方法是什么?

1 个答案:

答案 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;
   }
}