2017-10-12 129 views
-2

我一直在頭痛這個問題。我已經向自己製造了一個CLI空間射擊遊戲,在那裏你有飛船,激光和流星進行射擊。問題是這樣的:每當激光或流星到達我們競技場的邊界時,我想從矢量中抹去,這樣它就不會聚集起來。以下是我的工作代碼現在的樣子:C++矢量迭代器不增量

 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),但程序似乎在運行時崩潰給我之前說過的錯誤,我試着做其他邏輯檢查,但似乎也沒有工作,如果有人可以解釋從矢量中去除無用物體(在這種情況下是流星/激光)的正確方法。

+0

刪除矢量元素會導致迭代器無效。擦除矢量元素後,您需要在開始時重新啓動。 –

+0

您可能能夠從矢量的末尾開始並繼續到矢量的開始位置。任何擦除的元素都會影響您已搜索的元素的順序。不能保證迭代器在元素被擦除後即使是反向也不會有效。 –

+0

@ThomasMatthews阿哈。好的。但爲什麼不將它重置到矢量的開頭?它會再次開始循環,直到它達到另一個可刪除的程度,不是嗎? – Zablas

回答

1

關於erase()無效迭代器的評論是真實的。關於需要在開始時重新啓動的部分是錯誤的。你可以做,但你肯定不需要。)

erase()返回一個指向刪除項目之後的元素的仍然有效的迭代。

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

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