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

C++ : List iterator not incrementable

本文关键字:迭代器 列表 C++      更新时间:2023-10-16

在尝试擦除列表的最后一个元素时出现此错误。我调试了代码,并找出了导致它的原因和位置,这是我的代码:

    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; 
}