将while+if else转为更简单的std::remove_if
Turning while + if else to simpler std::remove_if
我正在尝试清理一些循环,并从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,用于检查对象是否排队等待删除(假设IsQueuedForRemoval
是const
(:
auto predicate = [](const Object& obj){ return obj.IsQueuedForRemoval();};
如果容器元素类型不是Object
,我将让您调整lambda。
相关文章:
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 使用容器中元素的别名删除带有 std::list::remove 的元素是否正确?
- C++代码"x.erase(std::remove(x.begin(), x.end(), ), x.end())"是如何工作的?
- std::remove, std::move(range) and moved-from elements
- 在不同类型的向量上使用 std::remove 的不同结果
- 为什么 std::remove 不删除数组的最后一个元素
- std::remove 和 std::remove_if 设计的稳定性是否失败
- std::unordered_map:渐近{search,insert,remove}性能取决于密钥的大小和数据类型
- std::remove 不起作用
- 为什么std::whatever::erase()是一个方法,std::remove()是独立函数
- std::erase 和 std::remove 组合以删除特定元素不适用于特定示例
- std::remove函数中的转换错误
- 使用 std::erase 和 std::remove 从矢量中删除元素,不使用自定义结构作为值
- vector.erase 和 std::remove 在自定义向量上
- 需要了解 std::remove with vector.erase
- 为什么std::remove不能和std::set一起工作
- 如何为std::list重载std::remove
- std::remove导致编译错误
- Std::remove不是从Std::vector中移除
- 为什么std::remove取迭代器的const版本