C++コンテナデータ削除時に反復器が無効になる

1268 ワード

c++コンテナの要素削除を行う場合は、反復器を使用し、eraseメソッドを呼び出す必要がある場合は、反復器のポインタの位置を入力する必要があります.
したがって、削除操作によって条件を満たして削除すると判断されると、面倒になる.
プロジェクトにおける共通解決構想一:
vectorベクトルを巡り、条件を満たす反復ポインタの位置を記録し、インデックスカウントとしてvectorに格納され、この順序は必ず前後にあるが、以下の規定に従って削除すると異常があり、
vector index;
vector vt;
vector::iterator it = vt.begin();
for(int i=0; i  vt.erase(it + index[i]);
}
このようにすると、1つの要素を削除すると、その要素を削除した後のすべての削除対象要素のインデックスが乱されるため、indexを後から前へ遍歴することを考慮します.
for(int i=index.size()-1; i>=0; i--) {
  vt.erase(it + index[i]);
}
これにより、エレメントを削除した後に削除するエレメントのインデックスを乱すことが回避されます.
 
ネット上でもう一つの一般的な方法は、eraseが返す反復ポインタ値を記録することです.
for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )
{
  if(* it == 8)
  {
     it = arr.erase(it); //    arr.erase(it);
  }
  else
  {
     ++it;
  }
}

 
次のようには書けません.
for(vector<int>::iterator it=arr.begin(); it!=arr.end(); it ++)
{
    if(* it == 8)
    {
        arr.erase(it); // erase ,it  ,     vector      ,it    “   ”。

     }
}