正确处理列表大小为1的std::列表擦除
Correctly handling std::list erase with list size 1
考虑以下内容:
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()
的问题,您也跳过了其他元素,但删除列表中的最后一个元素可能会导致崩溃。
相关文章:
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- C++如何生成std::数组列表
- std::vector 没有重载函数的实例与参数列表匹配
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 将 std::thread by 值推送到列表中
- 转发变量参数列表以模拟 std::thread
- 使用大括号初始化 std::vector 使用初始值设定项列表
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- 如何按键对 std::对列表进行排序?
- 访问列表中的所有 std::变体,并为每次访问捕获附加值
- std::map与谓词与初始化列表
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 将初始化器列表/聚合初始化转发到 std::array 成员
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 为什么不能用两层列表初始值设定项初始化 2D std::array?
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- C 初始化列表std ::数组最佳性能
- 与内存堆有关的C 链接列表(STD ::列表)是否使用新的
- 类模板的参数列表“;std::vector”;缺少