std::map や std::vector で erase

条件にマッチする要素を順に検索して削除すると、削除したときに iterator が無効になる。
vector なら、erase() が削除後に有効な次の要素への iterator を返してくれるので、
for (std::vector::iterator i = v.begin(); i != v.end(); ){
if ( condition )
i = v.erase(i);
else
i++;
}
map だと、iterator を返してくれないので、
for (std::map::iterator i = m.begin(); i != m.end(); ){
if (condition)
v.erase(i++);
else
i++;
}
のようにすればよい。両方とも for の () の、最後を空欄にするのがポイントですな。

コメントを残す