2013-12-17 39 views
8

如何从一个std::set删除元素同时遍历它从STD如何删除元素::在遍历其设置

我第一次尝试是这样的:

set<T> s; 

for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) { 
    //Do some stuff 
    if(/*some condition*/) 
     s.erase(iter--); 
} 

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

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

回答

13

标准的办法就是像做

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; 
    } 
} 
+0

第一个代码peice的失败的断言说,迭代器是在视觉studion不相容。无论如何,std :: erase会返回新的迭代器,就像您在代码中指出的一样。 – sajas