Code Fix

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

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

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

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

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

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

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