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

反復中に std::vector から要素を効率的に削除するにはどうすればよいですか?

DDD
リリース: 2024-10-29 13:32:29
オリジナル
989 人が閲覧しました

How to Efficiently Remove Elements from a std::vector During Iteration?

反復中に std::vector から要素を効率的に削除する

std::vector を反復処理し、ベクターのサイズの変更が必要なアクション (削除など) を実行する場合要素を使用すると、イテレータが無効になるという問題が発生する可能性があります。これは、要素の削除に使用される Erase() メソッドがベクトルのサイズを変更し、既存のイテレータをすべて無効にするためです。

無効なイテレータの回避

これを克服するには、戻り値を使用するのが効率的な解決策です。これは、削除された要素の直後にある要素を指す新しい有効な反復子を提供します。これにより、無効化された反復子を気にすることなく反復を続行できます。

次のコードは、このアプローチを示しています。

<code class="cpp">std::vector<std::string>::iterator iter;
for (iter = m_vPaths.begin(); iter != m_vPaths.end(); ) {
    if (::DeleteFile(iter->c_str())) {
        iter = m_vPaths.erase(iter);  // Returns a new valid iterator
    } else {
        ++iter;  // Advance iterator if file deletion failed
    }
}</code>
ログイン後にコピー

このコードでは、反復子は、ファイルの削除が成功するたびに次の要素が追加され、反復をスムーズに進めることができます。

代替データ構造

反復子のアプローチを使用すると効率的ですが、元の m_vPaths ベクトルが変更されるため、パフォーマンスが向上する可能性があります。複数の削除が必要な場合に影響します。このような場合は、要素を効率的に削除するために最適化された代替データ構造 (

  • std::list: など) の使用を検討した方が良い場合があります。 O(1) の時間計算量で要素を効率的に削除できるリスト。
  • std::set: 重複した要素を自動的に削除し、効率的な削除操作をサポートする順序付きセット。
  • std::unowned_set: 効率的な要素の削除もサポートする順序なしセットですが、反復順序が保証されていないことに注意することが重要です。

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

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