尝试删除列表的最后一个元素时遇到此错误。我调试了代码,并能够找出导致它的原因和原因,这是我的代码:

    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相同的迭代器,即指向最后一个最后一个元素的迭代器。此迭代器不应增加(如果列表不为空,则可以递减)。

关于C++ : List iterator not incrementable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6167082/

10-11 17:10