ホームページ > バックエンド開発 > C++ > 特定の条件チェックを行わないと、反復子を使用してベクター要素を消去するとクラッシュするのはなぜですか?

特定の条件チェックを行わないと、反復子を使用してベクター要素を消去するとクラッシュするのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-07 12:25:13
オリジナル
1005 人が閲覧しました

Why Does Erasing Vector Elements with an Iterator Crash Without a Specific Conditional Check?

追加の条件チェックを行わないと「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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート