【问题标题】:C++ : List iterator not incrementableC++:列表迭代器不可递增
【发布时间】:2011-09-04 06:08:46
【问题描述】:

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

    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
}

我不知道我做错了什么...有什么建议吗?

【问题讨论】:

  • 次要问题,但您可以将&(*i)->BoundingBox 简化为i->BoundingBox。粗略地说,迭代器就像指针。

标签: c++ list iterator increment


【解决方案1】:

您的算法有缺陷,因为您不了解 erase 返回的内容。

当你使用erase时,它会移除迭代器指向的元素,并返回一个指向下一个元素的迭代器。

如果您希望遍历列表的所有元素,这意味着无论何时使用erase,您都不应进一步增加它。

这是你应该得到的正常代码:

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

这巧妙地解决了您遇到的问题!因为当您erase 最后一个元素时,erase 将返回与end 相同的迭代器,即指向过去最后一个元素的迭代器。此迭代器永远不会增加(如果列表不为空,它可能会减少)。

【讨论】:

    【解决方案2】:

    你想要:

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

    【讨论】:

    • 当你最终得到 i 时为什么要使用 &(*i)。
    【解决方案3】:

    您需要将++i 放在else 子句中。 erase 函数返回下一个有效的迭代器,然后您将对其进行递增,以确保您不会迭代每个元素。您应该只在您选择不擦除的情况下增加它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-16
      • 2010-09-25
      • 1970-01-01
      • 2023-03-03
      • 2013-03-23
      • 1970-01-01
      相关资源
      最近更新 更多