反復中の std::vector からの要素の消去: 戦略とパフォーマンス
消去が必要なときに std::vector を反復処理する場合要素が条件に基づいているため、反復子を含む for ループを使用する従来のアプローチでは問題が発生する可能性があります。要素を消去するとイテレータが無効になり、ループが不完全になります。この課題に対処するために、このようなシナリオを処理するための最適な戦略を検討してみましょう。
無効化追跡による反復
1 つのアプローチは、要素の消去によって引き起こされる反復子の無効化を明示的に追跡することです。提供されたサンプル コード:
<code class="cpp">for (iterator it = begin; it != end(container) /* !!! */; ) { if (it->somecondition()) { it = vec.erase(it); // Returns the new iterator to continue from. } else { ++it; } }</code>
ここでの主な違いは、事前計算された end の代わりに end(container) を使用し、各消去操作の後にイテレータ参照を更新することです。これにより、ループ中の有効なイテレータ比較が保証されます。
std::remove_if と Erase の組み合わせ
より効率的なアプローチには、std::remove_if 関数と Erase 関数を組み合わせることが含まれます。これにより、無効化追跡の必要性がなくなり、プロセスが最適化されます。
<code class="cpp">iterator it = std::remove_if(begin, end, pred); vec.erase(it, vec.end());</code>
ここで、pred は、どの要素を削除するかを決定する削除述語を表します。このアプローチにより、反復消去に伴う O(N^2) の複雑さが解消され、パフォーマンスが O(N) に向上します。
サンプル アプリケーション
提供されたコード サンプルでは、 RemoveTimedEvent 構造体は、時限イベントのベクトル内の特定のウィジェットに関連付けられたイベントを識別して削除するための削除述語として機能します。
これらの戦略の 1 つを活用することで、実行中に std::vector から要素を効果的に消去できます。正しいイテレータの機能とパフォーマンスを維持しながら繰り返します。
以上が反復中に std::vector から要素を安全に消去するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。