追加の条件チェックを行わないと「Vector Erase Iterator」コードがクラッシュするのはなぜですか?
次のコードを考えてみましょう:
vector<int> res; res.push_back(1); vector<int>::iterator it = res.begin(); for( ; it != res.end(); it++) { it = res.erase(it); }
このコードは、反復子を使用してベクトルからすべての要素を消去しようとします。ただし、次の追加の条件チェックを行わないとクラッシュします。
if(it == res.end()) return 0;
説明
消去関数は、消去された要素の次の要素を指す反復子を返します。最後の要素が消去されると、返される反復子は res.end() と等しくなります。
元のコードでは、条件チェックなしで、for ループは、要素の最後に到達した後でも反復子をインクリメントし続けます。ベクター。これにより、ベクターの境界を超えてメモリにアクセスしようとしてクラッシュが発生します。
条件付きチェックを使用すると、反復子がベクターの終わりに到達したときにループが終了します (it == res.終わり())。これによりクラッシュが防止されます。
代替ループ構造
条件チェックの必要性を回避するには、ループを次のように書き換えます。
while (it != res.end()) { it = res.erase(it); }
条件が成立しなくなるため、このループは res.end() に到達すると自動的に終了しますtrue.
追加の考慮事項
要素を条件付きで消去する場合、要素が消去されない場合は反復子を手動でインクリメントする必要があります。これは、
for ( ; it != res.end(); ) { if (condition) it = res.erase(it); else ++it; }を使用して実現できます。
以上が特定の条件チェックを行わないと、反復子を使用してベクター要素を消去するとクラッシュするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。