C++:列表迭代器不可递增
C++ : List iterator not incrementable
在尝试擦除列表的最后一个元素时出现此错误。我调试了代码,并找出了导致它的原因和位置,这是我的代码:
for(Drop_List_t::iterator i = Drop_System.begin(); i != Drop_System.end() && !Drop_System_Disable; /**/)
{
if(Player->BoundingBox.Intersect(&(*i)->BoundingBox))
{
i = Drop_System.erase(i);
}
++i; //List iterator crashes here if last entry was deleted
}
我不明白我做错了什么。。。有什么建议吗?
您的算法有缺陷,因为您不了解erase
返回了什么。
使用erase
时,它会删除迭代器指向的元素,并向下一个元素返回迭代器。
如果您希望对列表的所有元素进行迭代,这意味着无论何时使用erase
,都不应该进一步增加它
这是你应该得到的正常代码:
if (Player->BoundingBox.Intersect(i->BoundingBox)) {
i = Drop_System.erase(i);
}
else {
++i;
}
这巧妙地解决了您遇到的问题!因为当erase
是最后一个元素时,erase
将返回与end
相同的迭代器,即一个指向最后一个元件后面一个迭代器。此迭代器永远不会递增(如果列表不为空,则可能递减)。
您需要将++i
放在else
子句中。erase
函数返回下一个有效的迭代器,然后对其进行递增,确保不会对每个元素进行迭代。您应该只在选择不擦除的情况下增加它。
您想要:
if(Player->BoundingBox.Intersect(&(*i)->BoundingBox))
{
i = Drop_System.erase(i);
}
else {
++i;
}
相关文章:
- 跟随整数索引列表的自定义类迭代器
- 列表的有效性在插入后开始迭代器
- C++列表迭代器
- 测试迭代器是否位于列表中的最后一个
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- C++不能取消引用结束列表迭代器
- 创建以向量/列表迭代器为键的映射
- 对列表中的向量使用迭代器
- 使用列表迭代器获取所有值
- 如何实现列表:<T>:迭代器?
- 将列表迭代器存储为成员
- 将列表 en 列表迭代器作为指针 C++ 传递
- 如何从该列表的元素中获取 std::list<T>::迭代器?
- 空列表迭代器比较始终为真
- 如何在给定迭代器列表的情况下从向量中删除元素
- C++迭代器列表
- 迭代器列表,用于从各种列表中收集条目
- 如何在 Map 中存储集合容器的迭代器列表
- 迭代器列表
- 操作迭代器列表+指针