ホームページ >バックエンド開発 >C++ >反復中に `std::list` から要素を安全に削除するにはどうすればよいですか?

反復中に `std::list` から要素を安全に削除するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-20 13:01:21443ブラウズ

How to Safely Remove Elements from an `std::list` While Iterating?

反復処理中に std::list から要素を削除できますか?

C では、組み込み std::list クラスは次のとおりです。要素の効率的な挿入と削除を提供する二重リンクリスト。ただし、反復中にリストを変更しようとする場合は、慎重に操作に取り組むことが重要です。

問題: std:: 内の項目のアクティビティ ステータスを反復的にチェックするときにエラーが発生しました。リストに表示され、非アクティブなアイテムをすぐに削除しようとしています。要素を削除した後に反復子を移動しようとすると、「リスト反復子は増分できません」というエラーが発生しました。

解決策: 反復中に要素を正常に削除する鍵は、変更を反復子に適用することです。まず、削除を実行する前に。イテレータをインクリメントしてから要素を削除する代わりに、ループを while ループとして再構築し、ループ自体の中でイテレータをインクリメントできるようにする方が適切です。したがって、以下の更新されたコードは、正しいアプローチを示しています。

std::list<item*>::iterator i = items.begin();
while (i != items.end()) {
    bool isActive = (*i)->update();
    if (!isActive) {
        i = items.erase(i);  // alternatively, i = items.erase(i++);
    } else {
        other_code_involving(*i);
        ++i;
    }
}

この改訂されたコードは、要素の削除を実行する前に反復子が正しくインクリメントされることを保証し、それによってエラーを回避し、反復処理中に非アクティブな要素を効率的に削除できるようにします。リスト。

以上が反復中に `std::list` から要素を安全に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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