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

Sve*_*ito 1 c++ stl stdlist

考虑以下:

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

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

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

Eva*_*ran 10

以下将正常工作:

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

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

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

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