上級 › vectorの要素をループ中に削除するとイテレータが無効化されるバグ › パターン1
vectorの要素をループ中に削除するとイテレータが無効化されるバグ
std::vectorの要素をfor文の中でeraseしながら、そのままイテレータをインクリメントし続けてしまうバグです。
1 #include <iostream> 2 #include <vector> 3 int main() { 4 std::vector<int> nums = {2, 4, 1, 3}; 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 }
出力: 4 1 3 (2番目の偶数4が消えずに残る)期待: 1 3
空欄を埋めてコンパイル・実行を通す
eraseは削除した位置以降の要素を前に詰め、削除した位置を指す新しいイテレータを返り値として返します。それを使わずに自分で++itすると、詰められて繰り上がってきた次の要素を読み飛ばしてしまいます。eraseの戻り値を使ってitを更新するのが正しい書き方です。
次の問題