[英]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
function 返回下一个有效的迭代器,然后您将对其进行递增,以确保您不会遍历每个元素。 您应该只在您选择不擦除的情况下增加它。
你要:
if(Player->BoundingBox.Intersect(&(*i)->BoundingBox))
{
i = Drop_System.erase(i);
}
else {
++i;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.