簡體   English   中英

C++ 向量迭代器不是增量的

[英]C++ vector iterator not incremental

我一直為這個問題頭疼。 我已經挑戰自己制作 CLI 太空射擊游戲,在那里你可以使用宇宙飛船、激光和流星進行射擊。 問題是這樣的:每當激光或流星到達我們競技場的邊界時,我想從向量中擦除,這樣它就不會聚集起來。 這是我的工作代碼現在的樣子:

        std::vector<Meteoras>::iterator itMet = meteorai.begin();
        std::vector<Lazeris>::iterator itLaz = lazeriai.begin();
        while (itMet != meteorai.end() || itLaz != lazeriai.end())
        {
            if (itLaz != lazeriai.end())
            {
                if (itLaz->getCoord()->x == j && itLaz->getCoord()->y == i)
                {
                    itLaz->move(); 
                    ++j; 
                    if (itLaz->getCoord()->x >= ILGIS - 1) continue;
                    else std::cout << itLaz->getIcon();
                }
                ++itLaz;
            }
            if (itMet != meteorai.end())
            {
                if (itMet->getCoord()->x - 1 == j && itMet->getCoord()->y == i)
                {
                    itMet->move();
                    ++j;
                    if (itMet->getCoord()->x <= 0) continue;
                    else std::cout << itMet->getIcon();
                }
                ++itMet;
            }
        }

所以那里有兩個“繼續”。 而不是他們,我嘗試放置迭代器刪除(如在itLaz = lazeriai.erase(itLaz)但程序似乎在運行時崩潰,給出了我之前提到的錯誤。我嘗試進行其他邏輯檢查,但似乎沒有用如果有人能解釋從向量中去除無用物體(在這種情況下是流星/激光)的正確方法,我將不勝感激。

關於erase()使迭代器無效的評論是正確的。 一開始需要重啟的部分是錯誤的。 (你可以這樣做,但你當然不需要。)

erase()返回一個仍然有效的迭代器,它指向被擦除項之后的元素。

if( test for erasing )
{
    itLaz = lazeriai.erase(itLaz);
}
else
{
   ++itlaz;
}

您可以重構代碼以使用std::remove_if()代替。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM