Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正确处理列表大小为1的std::列表擦除_C++_Stl_Stdlist - Fatal编程技术网

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

C++ 正确处理列表大小为1的std::列表擦除,c++,stl,stdlist,C++,Stl,Stdlist,考虑以下几点: for (it = list.begin(); it != list.end(); ++it) { if (!(*it)->alive) { it = list.erase(it); } } 只要list.size()>1就可以了。一旦列表中只包含一个元素,则会调用erase segfaults。我假设是因为没有下一个元素。至少,这是我观察到的行为。 有没有正确的方法来处理这个问题?也许是一种完全不同的方法 正如你所看到的,我不想立即清除列

考虑以下几点:

for (it = list.begin(); it != list.end(); ++it) {
    if (!(*it)->alive) {
        it = list.erase(it);
    }
}
只要
list.size()>1
就可以了。一旦列表中只包含一个元素,则会调用erase segfaults。我假设是因为没有下一个元素。至少,这是我观察到的行为。 有没有正确的方法来处理这个问题?也许是一种完全不同的方法


正如你所看到的,我不想立即清除列表。我只想在元素消亡时删除它们,这可以正常工作,直到删除最后一个元素。

以下操作将正常工作:

for (it = list.begin(); it != list.end(); ) {
    if (!(*it)->alive) {
        it = list.erase(it);
    } else {
        ++it;
    }
}
问题不仅仅在于某些尺寸。在您的示例中,每次删除一个元素时,都会跳过一个元素。想想看

如果元素不是“活动的”,则执行以下操作:
it=list.erase(它)
,它删除该元素并将其设置为其后的元素然后循环执行
++it
,这会跳过下一个循环,可能会跳过
end()


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

以下操作将正常工作:

for (it = list.begin(); it != list.end(); ) {
    if (!(*it)->alive) {
        it = list.erase(it);
    } else {
        ++it;
    }
}
问题不仅仅在于某些尺寸。在您的示例中,每次删除一个元素时,都会跳过一个元素。想想看

如果元素不是“活动的”,则执行以下操作:
it=list.erase(它)
,它删除该元素并将其设置为其后的元素然后循环执行
++it
,这会跳过下一个循环,可能会跳过
end()


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

类似:顺便说一句,您这里没有内存泄漏吗?列表似乎包含指针,您可以在不删除指针的情况下删除它们。指向的对象仍然可以访问吗?指针仍然可以从另一个列表中访问。当他们死后,他们会进入死亡名单,然后在需要的时候被回收到活名单上。保存一些alloc和dealloc循环。类似:顺便说一句,这里没有内存泄漏吗?列表似乎包含指针,您可以在不删除指针的情况下删除它们。指向的对象仍然可以访问吗?指针仍然可以从另一个列表中访问。当他们死后,他们会进入死亡名单,然后在需要的时候被回收到活名单上。保存一些alloc和dealloc循环。谢谢。奇怪的是,我上面的代码在用g++编译的linux上运行,但在我家的Mac上似乎崩溃了。我需要再检查一下。但我会尝试你的解决方案,看看它是否能解决Mac上的问题。我有一种感觉,你说的“工作”是指“不会崩溃”:-。您的代码有未定义的行为,这意味着它被允许执行任何操作。此外,问题不仅在于循环结束,还在于每次删除一个元素时都会跳过一个元素。只有当您碰巧删除了最后一个时,它才会崩溃。正是:)-现在才有意义。谢谢,谢谢。奇怪的是,我上面的代码在用g++编译的linux上运行,但在我家的Mac上似乎崩溃了。我需要再检查一下。但我会尝试你的解决方案,看看它是否能解决Mac上的问题。我有一种感觉,你说的“工作”是指“不会崩溃”:-。您的代码有未定义的行为,这意味着它被允许执行任何操作。此外,问题不仅在于循环结束,还在于每次删除一个元素时都会跳过一个元素。只有当您碰巧删除了最后一个时,它才会崩溃。正是:)-现在才有意义。谢谢