C ++:列表迭代器不可递增

问题描述

| 尝试删除列表的最后一个元素时遇到此错误。我调试了代码,并能够找出导致它的原因和原因,这是我的代码:
    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
}
我不知道自己在做什么错...有什么建议吗?     

解决方法

        您的算法有缺陷,因为您不了解ѭ1返回的结果。 使用
erase
时,它将删除迭代器指向的元素,并将迭代器返回到下一个元素。 如果要遍历列表的所有元素,则意味着每当使用
erase
时,都不应进一步对其进行递增。 这是您应该获得的普通代码:
if (Player->BoundingBox.Intersect(i->BoundingBox)) {
  i = Drop_System.erase(i);
}
else {
  ++i; 
}
这就巧妙地解决了您遇到的问题!因为当您对最后一个元素
erase
时,
erase
将返回与
end
相同的迭代器,即指向最后一个倒数元素的迭代器。该迭代器绝不能递增(如果列表不为空,则可以递减)。     ,        您需要在
else
子句中放入
++i
erase
函数将返回下一个有效的迭代器-,然后对其进行递增,确保不对每个元素进行迭代。仅在选择不删除的情况下才应增加它。     ,        你要:
if(Player->BoundingBox.Intersect(&(*i)->BoundingBox))
{
    i = Drop_System.erase(i);
}
else {
    ++i; 
}
    

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...