Code Fix

上級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は削除した位置以降の要素を前に詰めるため、単純な++itでは次の要素を読み飛ばしてしまいます。

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

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