考虑以下代码:
for (std::list<item*>::iterator i = items.begin(); i != items.end(); i++) { bool isActive = (*i)->update(); // if (!isActive) items.remove(*i); // else other_code_involving(*i); } items.remove_if(CheckItemNotActive);
目标是在更新不活动项目后立即将其从列表中删除,从而避免第二次传递。但是,尝试使用注释掉的行删除循环中的元素会导致错误“列表迭代器不可递增”。
在迭代期间安全删除元素的关键是遵循正确的操作顺序。应将代码修改为 while 循环,而不是上面显示的 for 循环方法,如下所示:
std::list<item*>::iterator i = items.begin(); while (i != items.end()) { bool isActive = (*i)->update(); if (!isActive) { items.erase(i++); // alternatively, i = items.erase(i); } else { other_code_involving(*i); ++i; } }
通过首先递增迭代器 (i ),迭代器保持有效并可用于删除非活动元素。
在原始 for 循环中,尝试使用 items.remove(*i) 删除元素循环体使迭代器(i)无效,导致后续迭代失败。 while 循环确保迭代器在元素被删除之前更新,从而确保其对于后续迭代的有效性。通过使用 items.erase(i ) 或 i = items.erase(i),从列表中删除适当的元素,并且迭代器会自动更新以指向下一个有效元素。
这种方法允许用于在迭代期间有效删除不活动的项目,而不需要单独遍历列表。
以上是如何在迭代时安全地从 std::list 中删除元素?的详细内容。更多信息请关注PHP中文网其他相关文章!