这是一个好的或标准的做法,像这样编码循环矢量,同时从中删除不需要的元素而不会失去性能。如果有更快的方式请建议。
此向量的格式为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());
}
答案 0 :(得分:2)
是的,它被称为erase-remove成语。
来自维基百科的引用:
erase-remove idiom 是一种消除元素的常见C ++技术 满足C ++标准库中的某个标准 容器
erase
可用于从集合中删除元素,但是 基于数组的容器,例如vector,所有元素 在删除的元素必须向前移动之后,以避免&#34;间隙&#34;在 集合。算法库提供
remove
和remove_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());
}