迭代向量并删除内容

时间:2018-06-06 17:31:46

标签: c++ c++11 vector

这是一个好的或标准的做法,像这样编码循环矢量,同时从中删除不需要的元素而不会失去性能。如果有更快的方式请建议。 此向量的格式为std::vector<AnimationState*> activeAnimations;

void AnimationPack::removeDeadAnimations()
{
    int counter = 0;
    std::remove_if(activeAnimations.begin(), activeAnimations.end(), 
        [&](AnimationState*& animation) {
            if (animation->isActive())
            {
                counter++;
                return true;
            }
            else
                return false;
        });
    activeAnimations.erase(activeAnimations.end() - counter, activeAnimations.end());
}

编辑版

void AnimationPack::removeDeadAnimations()
{
    activeAnimations.erase(std::remove_if(activeAnimations.begin(), activeAnimations.end(), 
        [&](AnimationState*& animation) {
            if (animation->isActive())
                return true;
            else
                return false;
        }),activeAnimations.end());
}

已编辑的代码(根据评论建议)

void AnimationPack::removeDeadAnimations()
{
    activeAnimations.erase(std::remove_if(activeAnimations.begin(), activeAnimations.end(),
        [](AnimationState*& animation) { return animation->isActive(); }), activeAnimations.end());
}

2 个答案:

答案 0 :(得分:2)

是的,它被称为erase-remove成语。

来自维基百科的引用:

  

erase-remove idiom 是一种消除元素的常见C ++技术   满足C ++标准库中的某个标准   容器

     

erase可用于从集合中删除元素,但是   基于数组的容器,例如vector,所有元素   在删除的元素必须向前移动之后,以避免&#34;间隙&#34;在   集合。

     

算法库提供removeremove_if算法   为了这。

     

这些算法不会从容器中删除元素,而是移动   所有不符合删除标准的元素都在前面   范围,保持元素的相对顺序。这是在一个完成   单次通过数据范围。

     

remove返回一个指向第一个元素的迭代器,所以   只需拨打一次erase即可删除它们。

答案 1 :(得分:1)

在迭代过程中从向量中删除和删除元素。

 void AnimationPack::removeDeadAnimations()
    {
        activeAnimations.erase(std::remove_if(activeAnimations.begin(), activeAnimations.end(),
            [&](AnimationState*& animation) {
            if (animation->isActive())
                return false;
            else
            {
                delete animation;
                return true;
            }
        }), activeAnimations.end());
    }