上級 › vectorの要素をループ中に削除するとイテレータが無効化されるバグ › パターン2
vectorの要素をループ中に削除するとイテレータが無効化されるバグ
std::vectorの要素をfor文の中でeraseしながら、そのままイテレータをインクリメントし続けてしまうバグです。
1 #include <iostream> 2 #include <vector> 3 int main() { 4 std::vector<int> vals = {6, 8, 1, 5}; 5 for (auto it = vals.begin(); it != vals.end(); _____________________________________________) { ^ 6 if (*it % 2 == 0) { 7 vals.erase(it); 8 } 9 } 10 for (int v : vals) std::cout << v << " "; 11 std::cout << std::endl; 12 return 0; 13 }
出力: 8 1 5 (2番目の偶数8が消えずに残る)期待: 1 5
空欄を埋めてコンパイル・実行を通す
「イテレータはコンテナの中身が変わっても位置を追いかけてくれる」というのは誤解です。vector::eraseは呼んだ時点でそのイテレータ自身を無効にします。
次の問題