将while+if else转为更简单的std::remove_if

Turning while + if else to simpler std::remove_if

本文关键字:std remove if 更简单 while+if else      更新时间:2023-10-16

我正在尝试清理一些循环,并从while和if/else转移到std::remove_if中,而且以前从未这样做过,有人能告诉我如何将下面的内容转换为remove_if以获得相同的结果吗?理想情况下,我想消除if(obj->IsQueuedForRemoval(。

提前谢谢!

首字母:

void ObjectCollection::ProcessRemovals()
{
bool removed = false;
auto objIterator = objects.begin();
while (objIterator != objects.end())
{
auto obj = *objIterator;
if (obj->IsQueuedForRemoval())
{
objIterator = objects.erase(objIterator);
removed = true;
}
else
{
++objIterator;
}
}
if (removed)
{
drawables.ProcessRemovals();
collidables.ProcessRemovals();
}
}

我遇到的问题是如何保留bool,如果它删除了任何内容,则触发它,如果它从那里删除,则只转到drawables和collidables进程删除。

std::remove_if将迭代器返回到未删除元素范围的末尾。您可以将擦除删除分为两个步骤:

auto it = std::remove_if(objects.begin(), objects.end(),predicate)
bool removed = (it != objects.end());
if (removed) {
objects.erase(it,objects.end());
drawables.ProcessRemovals();
collidables.ProcessRemovals();
}

其中predicate可以是一个lambda,用于检查对象是否排队等待删除(假设IsQueuedForRemovalconst(:

auto predicate = [](const Object& obj){ return obj.IsQueuedForRemoval();};

如果容器元素类型不是Object,我将让您调整lambda。