[英]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.