提供されたコード スニペットでは、for ループは res.erase(it) を使用してベクトル res から要素を消去します。同じループ内でそれをインクリメントします。ただし、これにより予期しない動作やクラッシュが発生します。
このコードでは、処理中の現在の要素を指すベクトル反復子 it が使用されています。 res.erase(it) 関数は、それが指す要素を消去し、ベクトル内の次の要素を指す反復子を返します。提供されたコードでは、ループは、ベクトル (.end()) の終わりを指している場合でも、返されたこの反復子を使用し続けます。
ここで使用されているようなランダム アクセス反復子は使用できません。それらが属するシーケンスの終わりを超えて増加します。したがって、ループ内で .end() をインクリメントするとクラッシュが発生します。
この問題を解決するには、for ループによって提供される自動インクリメントに依存するのではなく、while ループを使用するように for ループを変更する必要があります。
while (it != res.end()) { it = res.erase(it); }
このアプローチにより、ベクトルの終わりに到達するまでループが継続され、無効な反復子の増分によるクラッシュの危険がなく、消去された要素が正しくスキップされます。操作。
以上がイテレータを使用してベクトルから要素を消去し、For ループで要素をインクリメントするとクラッシュが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。