ban*_*ewk 4 c++ iterator list increment
尝试擦除列表的最后一个元素时出现此错误.我调试了代码,并能够找出导致它的原因和位置,这是我的代码:
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
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚我做错了什么......有什么建议吗?
Mat*_* M. 14
您的算法存在缺陷,因为您不了解erase返回的内容.
使用时erase,它会删除迭代器指向的元素,并将迭代器返回到下一个元素.
如果您希望迭代列表的所有元素,则意味着无论何时erase使用,您都不应该进一步递增它.
这是你应该得到的正常代码:
if (Player->BoundingBox.Intersect(i->BoundingBox)) {
i = Drop_System.erase(i);
}
else {
++i;
}
Run Code Online (Sandbox Code Playgroud)
这巧妙地解决了您遇到的问题!因为当你erase最后一个元素时,erase将返回相同的迭代器end,即迭代器指向一个过去的最后一个元素.这个迭代器将永远不会被递增(如果该列表不为空可以递减).