簡體   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