正确处理列表大小为1的std :: list erase

时间:2011-06-21 19:33:04

标签: c++ stl stdlist

请考虑以下事项:

for (it = list.begin(); it != list.end(); ++it) {
    if (!(*it)->alive) {
        it = list.erase(it);
    }
}

只要list.size() > 1,这就可以正常工作。一旦列表只包含一个元素,则调用erase segfaults。我假设因为没有下一个元素。至少,这是我观察到的行为。 有没有正确的方法来处理这个?也许是一种完全不同的方法?

如您所见,我不想立即清除列表。我想在它们死亡时删除元素,这样可以正常工作,直到它删除最后一个元素。

1 个答案:

答案 0 :(得分:10)

以下内容将正常运行:

for (it = list.begin(); it != list.end(); ) {
    if (!(*it)->alive) {
        it = list.erase(it);
    } else {
        ++it;
    }
}

问题不仅在于某些尺寸。在您的示例中,每次删除元素时,您都跳过元素。想一想。

如果元素不是“活着”,那么你执行:it = list.erase(it);,删除元素并将it设置为跟随它的那个元素。 然后你的循环执行++it ,跳过下一个,可能会跳过end()

这不仅仅是跳过end()的问题,您也在跳过其他人,但删除列表中的最后一个元素可能会导致崩溃。