2017-10-12 7 views
-2

J'ai eu un mal de tête avec ce problème. Je me suis mis au défi de créer un jeu de tir spatial CLI, où vous avez des vaisseaux spatiaux, des lasers et des météores à photographier. Le problème est le suivant: à chaque fois qu'un laser ou un météore atteint les limites de notre arène, je veux effacer du vecteur pour qu'il ne se regroupe pas. Voici à quoi ressemble mon code de travail maintenant:Itérateur de vecteur C++ non incrémental

 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; 
      } 
     } 

Il y a donc deux "continues" là-dedans. Au lieu d'eux j'ai essayé de placer des suppressions d'itérateur (comme dans itLaz = lazeriai.erase(itLaz) mais que le programme a semblé tomber en panne pendant l'exécution en donnant l'erreur que j'ai énoncée avant.J'ai essayé d'effectuer d'autres vérifications logiques mais cela ne fonctionnait pas non plus. pourrait expliquer une manière correcte d'enlever un objet inutile (dans ce cas un météore/laser) d'un vecteur

+0

L'effacement des éléments vectoriels invalide l'itérateur. Vous devrez redémarrer au début après avoir effacé un élément du vecteur. –

+0

Vous pouvez commencer à la fin du vecteur et passer au début du vecteur. Tous les éléments effacés affectent l'ordre des éléments que vous avez déjà recherchés. Aucune garantie que l'itérateur sera valide après qu'un élément a été effacé, allant même dans le sens inverse. –

+0

@ThomasMatthews Aha. D'accord. Mais pourquoi ne pas le réinitialiser au début du vecteur? Il recommencerait à le parcourir jusqu'à ce qu'il atteigne un autre effacement, n'est-ce pas? – Zablas

Répondre

1

Le commentaire au sujet de erase() invalidant un itérateur est vrai La partie au sujet de devoir recommencer au début est fausse. vous pouvez le faire, mais vous ne avez certainement pas besoin.)

erase() retourne un itérateur toujours valide qui pointe à l'élément après l'élément effacé.

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

Vous pourriez être en mesure de refactoriser votre code pour utiliser std::remove_if() à la place.