2017-05-22 8 views
0

は、私は私が持つ要素がある場合は削除しようとしています、私は標準リストから要素を削除する

list<Human> mylist; 
    Human x ("Mike",13); 
    Human y("pavlek",33); 

押し込ま2つの要素でリストを作成している以下のクラスに

class Human 
{ 
public: 
    Human(); 
    Human(string,int); 
    virtual ~Human(); 
    string getName(); 

protected: 

private: 
    string name; 
    int staj; 
}; 

を持っていると仮定します

for(list<Human>::iterator it=mylist.begin();it!=mylist.end();++it) 
    { 


    if(it->getName()=="Mike") 
    { 
     mylist.remove(it); 
     cout<< "removed"; 
     cout<<it->getName(); 
    } 

}

: "マイク" という名前を付け、私はこのようにそれを削除しようとしました

しかし、remove()関数に値を渡すときにエラーが発生しましたが、この要素をリストから削除するにはどうすればよいですか?

+1

''と 'erase' -remove_if'イディオムの使用を検討してください:https://stackoverflow.com/questions/39019806/using-erase-remove-if-idiomしかし、もしそうでなければ、少なくともあなたの 'end()'イテレータをキャッシュしてください! ;-)また、この答えは、最初に一致する要素のみを削除するために、 ''を使ってより良い方法を示しています(https://stackoverflow.com/questions/14737780/how-do-i-remove-the)。 - ベクトルからの値の最初の出現 –

+0

https://stackoverflow.com/questions/3866642/stl-list-erase-items – pm100

答えて

2

eraseremoveと間違えているだけです。 C++参考文献によれば、にはremoveが使用されています。一方、eraseremoves a single element given its position or a range of elements given the start and end positions

あなたは単にこのような何かを、その名の通り"Mike"を含む最初の要素を削除する必要がある場合:

for(list<Human>::iterator it=mylist.begin();it!=mylist.end();++it) 
{ 
    if(it->getName() == "Mike") 
    { 
     mylist.erase(it); 
     break; 
    } 
} 

after using erase, your iterator will be invalidatedことを注意してください。次の有効なイテレーター値である戻り値eraseを使用して回避することができます。あなたのリストに名前が"Mike"の複数の要素が含まれている場合、この詳細は重要です。

+0

このコードは動作しません。イテレータは消去後に呼び出されます – pm100

0

Matheus Portelaのソリューションは古いC++ 98メソッドでした。今はずっと簡単です:

mylist.remove_if([](Human const& h){return h.getName()=="Mike";}); 

条件は[](Human const& h){return h.getName()=="Mike";}です。これは、Human hを削除する必要がある場合にtrueを返すラムダ式です。他のプロパティまたはプロパティの組み合わせをテストすることができます。 { }ラムダの一部は実際の関数本体です。

その他の例:あなたは、後者はstd::any_ofと容易になるだろう

mylist.remove_if([](Human const& h){return h.getName().size() > 4; }); 

mylist.remove_if([](Human const& h) { 
    for (char c: h.getName()) 
     if (c=='i') return true; // remove if name contains an i 
    return false; }); 

マインドあなたもそこでのforループを持つことができます。

関連する問題