上級 › vectorの要素をループ中に削除するとイテレータが無効化されるバグ › パターン3
vectorの要素をループ中に削除するとイテレータが無効化されるバグ
std::vectorの要素をfor文の中でeraseしながら、そのままイテレータをインクリメントし続けてしまうバグです。
1 #include <iostream> 2 #include <vector> 3 int main() { 4 std::vector<int> nums = {10, 12, 3, 9}; 5 for (auto it = nums.begin(); it != nums.end(); _____________________________________________) { ^ 6 if (*it % 2 == 0) { 7 nums.erase(it); 8 } 9 } 10 for (int n : nums) std::cout << n << " "; 11 std::cout << std::endl; 12 return 0; 13 }
出力: 12 3 9 (2番目の偶数12が消えずに残る)期待: 3 9
空欄を埋めてコンパイル・実行を通す
単純なfor文の++itだけで削除を扱おうとすると1つ余分に読み飛ばします。vectorから複数条件で削除するときは、eraseの戻り値でイテレータを更新するか、std::remove_ifとの組み合わせ(消去・削除イディオム)を使うのが安全です。
次の問題