从 std::list 迭代和删除元素
在迭代 std::list 时从 std::list 中删除元素需要仔细处理避免使迭代器无效。一种常见的误解是假设在求值后立即删除元素将正确增加迭代器。但是,这种方法会导致“列表迭代器不可递增”错误。
了解迭代器行为
在 std::list 中,元素是连续分配的。当删除一个元素时,后续元素会移动以填充空出的空间。结果,最初指向被删除元素的迭代器变得无效。递增此迭代器将导致未定义的行为。
正确方法:先递增,后删除
要在迭代时正确删除元素,请采用以下策略:
使用 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; } }
此修改后的代码迭代列表并且:
避免使用Remove_if方法
您的原始代码在循环后包含一个remove_if() 调用。在这种情况下,通常不鼓励使用这种方法,因为它需要额外遍历列表。如上所示,一次迭代和删除是一种更高效、更简单的解决方案。
以上是如何安全地迭代和删除 std::list 中的元素?的详细内容。更多信息请关注PHP中文网其他相关文章!