編集メニュー > 新規作成 編集 コピー 名前の変更 凍結 アップロード 添付ファイル一覧 バックアップ

vector

eraseの使い方

eraseを使用するときは以下のように書く。

std::vector::iterator it = v.begin();
while ( it != v.end(); ){
  if ( 条件 )  it = v.erase(it);
  else         it++;
                <--ここにit++;を入れてはいけない。
 }

eraseは削除後に有効な次の要素への iterator を返す。 なのでwhileの最後でインクリメントすると1つ要素をスキップしてしまう。

ちなみに以下もよさそうだが危ういとのこと。

for (int i=0;i<(int)v.size();++i){
  if ( 条件 )  {
    v.erase(i);
    --i;
 }

T君のコードはこうなっていてダメなときと大丈夫なときがある。 どういうときにダメなのかまだ理解できていない。。。