ベクターを反復処理する場合、特定の基準を満たす要素を削除することが必要になる場合があります。ただし、単純に削除すると、ループに使用されるイテレータが無効になる可能性があります。この記事では、v[i] メソッドを使用せずに要素を効率的に消去するためのソリューションを提供します。
消去後のイテレータの維持
erase() メソッドは新しいイテレータを返します。削除された要素の後の要素を指します。これにより、ループ条件を更新することで継続的な反復が可能になります。
<code class="cpp">for(iterator it = begin; it != end(container); it = vec.erase(it)) { if (it->somecondition()) { it = vec.erase(it); } }</code>
remove_if と Erase の組み合わせ
削除プロセスを最適化するには、std::remove_if と Erase の使用を検討してください。 together:
<code class="cpp">iterator it = std::remove_if(begin, end, pred); vec.erase(it, vec.end());</code>
このアプローチでは、対象となる要素の削除と実際の削除が分離され、O(N) 操作が高速化されます。
テンプレートベースの削除の例
削除プロセスを一般化するには、テンプレートベースの述語とremove_by_caller クラスを使用します。
<code class="cpp">class remove_by_caller { public: remove_by_caller(AguiWidgetBase* pWidget) : mWidget(pWidget) {} template <typename T> bool operator()(const T& pX) const { return pX.getCaller() == mWidget; } private: AguiWidgetBase* mWidget; }; std::vector<AguiTimedEvent>::iterator it = std::remove_if(timedEvents.begin(), timedEvents.end(), remove_by_caller(widget)); timedEvents.erase(it, timedEvents.end());</code>
これらのアプローチにより、要素を維持しながらベクトルから要素を効率的に削除できます。イテレータ。
以上がイテレータを無効にすることなく、反復中にベクトルから要素を効率的に消去するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。