ホームページ >バックエンド開発 >C++ >イテレータを無効にすることなく、反復中にベクトルから要素を効率的に消去するにはどうすればよいですか?

イテレータを無効にすることなく、反復中にベクトルから要素を効率的に消去するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-04 07:37:021088ブラウズ

How to Efficiently Erase Elements from a Vector During Iteration Without Invalidating the Iterator?

反復中のベクターからの効率的な消去

ベクターを反復処理する場合、特定の基準を満たす要素を削除することが必要になる場合があります。ただし、単純に削除すると、ループに使用されるイテレータが無効になる可能性があります。この記事では、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 サイトの他の関連記事を参照してください。

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