2017-02-27 11 views
-1

EDIT消去:この質問は、特にはstdを指し::リストを - スタックオーバーフロー上の他の同様の質問ははstdを参照してください::ベクトルC++一覧イテレーションと

私はC++を使用して、トラブルSTDから要素を消去を抱えています:: iterating中のリスト私は、カスタムクラスのリスト(この質問のために「オブジェクト」)を持っている、と私のコードは次のようになります。STDへの呼び出しのために「ノーマッチング機能:私はエラーを取得しています

for(auto i : Objects) 
    if(i.EraseFlag == true) 
     { 
      i = Objects.erase(i); 
     } 

: :list :: erase(Object &) '

これは、リストを反復処理し、要素を消去し、消去を考慮に入れたイテレータを返す正しい方法だと思います(C++ 11以降)。私は何か間違っている。以前はベクトルを使用しているとき、私はforループで整数である 'Objects.erase(Objects.begin()+ i)'を使用しますが、リストのアクセス要件を考えるとこれは動作しません。

ヘルプありがとうございます。

おかげ

+0

erase()はパラメータとしてイテレータをとります。 –

+1

範囲ベースのforループ中にシーケンスを変更しないでください。 – PaulMcKenzie

+1

*これは、リストを反復処理し、要素を消去し、消去を考慮したイテレータを返す、正しい方法(C++ 11以降)だと思います。* 'イレーズ/除去'イディオム、ループは必要ありません? – PaulMcKenzie

答えて

1

メンバ関数イテレータとerase扱っています。

このようなタスクでは、通常のforループを正しく使用することができます。たとえば、

for (auto it = Objects.begin(); it != Objects.end();) 
{ 
    if (it->EraseFlag) it = Objects.erase(it); 
    else ++it; 
} 

もう1つの方法は、メンバー関数remove_ifを使用することです。例えば、

Objects.remove_if([](const auto &value) { return value.EraseFlag; }); 
+0

おかげさまで、あなたの初期ループがうまくいくようです。それはremove_ifを使用して見てこれを行うためのベストプラクティスの方法は、あなたが含まれているので、私は答え – nathanburns

+0

@ nathanburnsでこれをマークします。どういたしまして。 –