首页  >  文章  >  后端开发  >  如何在迭代过程中有效地删除向量中的元素而不使迭代器失效?

如何在迭代过程中有效地删除向量中的元素而不使迭代器失效?

Susan Sarandon
Susan Sarandon原创
2024-11-04 07:37:021024浏览

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一起:

<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn