Code Fix

上級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

空欄を埋めてコンパイル・実行を通す

広告
広告スロット(未設定)

vectorの要素をループ中に削除するとイテレータが無効化されるバグ

eraseは削除した位置以降の要素を前に詰めるため、単純な++itでは次の要素を読み飛ばしてしまいます。

このエラーの解説と類題をまとめて見る →

広告
広告スロット(未設定)