2013-12-17 8 views
8

削除する方法の要素::それを反復しながら、設定し、それを反復しながら、私は<code>std::set</code>から要素を削除するにはどうすればよい

のように私の最初の試みはになります。これには問題がある

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

標準的な方法は、iterのコピーが消去に渡されますので、iterが、とにかく無効にされることはありませんが、私たちのiterが既にあることを、私たちは確信している第一の条件では

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

ような何かを行うことです消去が呼び出される前にインクリメントされます。 C++ 11では

、コードは、コードの最初peiceがイテレータビジュアルstudionに非相溶性であるという主張を失敗

+0

for(set<T>::iterator iter = s.begin(); iter != s.end();) { if(/*some condition*/) { iter = s.erase(iter); } else { ++iter; } } 
ようになります。とにかく、あなたのコードで指摘したように、std :: eraseは新しいイテレータを返します。 – sajas

関連する問題