繁体   English   中英

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 function 返回下一个有效的迭代器,然后您将对其进行递增,以确保您不会遍历每个元素。 您应该只在您选择不擦除的情况下增加它。

你要:

if(Player->BoundingBox.Intersect(&(*i)->BoundingBox))
{
    i = Drop_System.erase(i);
}
else {
    ++i; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM