last-modified: 2019-04-28 (日) 18:36:58 (1836d)[変更箇所]
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君のコードはこうなっていてダメなときと大丈夫なときがある。 どういうときにダメなのかまだ理解できていない。。。