迭代 std::list 时,在维护有效迭代器的同时删除元素可能具有挑战性。考虑以下代码:
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 循环方法:
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 = items.erase(i)”。这允许在迭代时安全有效地删除元素。
以上是如何在迭代期间安全地从 std::list 中删除元素?的详细内容。更多信息请关注PHP中文网其他相关文章!