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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-07 12:25:13998ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。