正确处理列表大小为1的std::列表擦除

Correctly handling std::list erase with list size 1

本文关键字:列表 std 擦除 小为 正确处理      更新时间:2023-10-16

考虑以下内容:

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

这与CCD_ 1一样好。一旦列表只包含一个元素,则调用擦除segfault。我之所以假设,是因为没有下一个元素。至少,这是我观察到的行为。有正确的方法来处理这个问题吗?也许是一种完全不同的方法?

正如你所看到的,我不想立即清除列表。我只想在元素死亡时删除它们,这很好,直到它删除最后一个元素。

以下各项将正常工作:

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

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

如果元素不"活动",则执行:it = list.erase(it);,它将删除元素并将it设置为其后面的元素。然后循环执行++it,它将跳过下一个元素,可能会跳过end()

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