2011-05-29 117 views
4

嘗試擦除列表的最後一個元素時出現此錯誤。我調試的代碼,並能夠找出是什麼原因導致它在哪裏,這裏是我的代碼:C++:列表迭代器不可增量

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 
} 

我想不出我做錯了什麼?有什麼建議?

+0

小點,但你可以簡化'&(* i) - > BoundingBox'到'i-> BoundingBox'。粗略地說,迭代器就像指針一樣。 – 2011-05-29 10:07:54

回答

11

你的算法是有缺陷的,因爲你不明白erase返回。

當您使用erase時,它將刪除指向迭代器的元素,並將迭代器返回到下一個元素。

如果你想遍歷列表中的所有元素,這意味着只要使用了erase,你就不應該再增加它。

這是你應該得到的正常代碼:

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

這巧妙地解決您所遇到的問題!因爲當你最後一個元素erase時,erase將返回與end相同的迭代器,即迭代器指向最後一個元素。這個迭代器應該永不增加(如果列表不爲空,它可以遞減)。

5

您需要將++i置於else子句中。 erase函數返回下一個有效的迭代器 - 然後您將對它進行遞增,確保您不會遍歷每個元素。你應該只在你選擇不擦除的情況下增加它。

+0

感謝您的解釋!得到它的工作,真棒快速的答案! – bandrewk 2011-05-29 10:16:14

4

你想:

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

當你最終獲得我自己時,爲什麼要使用&(* i)。 – 2012-06-23 01:57:35