2016-04-17 27 views
0

だから、私は上記のようにしたいと思っていました。私は、通常の繰り返し、メソッドの3番目の部分になると素晴らしいアイデアを考え出しました。しかし、私はループの中にループがあるときにこの問題に対処する方法を知らない。そして、はい、私はそれが消去中に要素をスキップすることによって引き起こされることを知っています。消去を使ってベクトルから要素を消去する

int Collision::missleCollision(vector <Missle*> &missle_vector, vector <Enemy*> &enemy_vector, 
           vector <Obstacle*> &obstacle_vector, bool G) 
{ 
    int hit=0; 
    for (auto it=missle_vector.begin(); it!=missle_vector.end(); ++it) 
    { 
     for (auto jt=enemy_vector.begin(); jt!=enemy_vector.end(); ++jt) 
     { 
      double x, y; 
      x=(*jt)->getX()-(*it)->getX(); 
      y=(*jt)->getY()-(*it)->getY(); 
      if (x<64 && x>-151 && y<14 && y>-103) 
      { 
       delete *it; 
       it=missle_vector.erase(it); 
       delete *jt; 
       jt=enemy_vector.erase(jt); 
       hit++; 
      } 
     } 
    } 

    if(G){ 
     for (auto it = missle_vector.begin(); it!=missle_vector.end(); ++it) 
     { 
      for (auto jt = obstacle_vector.begin(); jt!=obstacle_vector.end(); ++jt) 
      { 
       double x, y; 
       x=(*jt)->getX()-(*it)->getX(); 
       y=(*jt)->getY()-(*it)->getY(); 
       if (x<64 && x>-61 && y<14 && y>-61) 
       { 
        delete *it; 
        it = missle_vector.erase(it); 
       } 
      } 
     } 
    } 

    for (auto it = missle_vector.begin(); it != missle_vector.end();) 
    { 
     if ((*it)->getX() > 1920) 
     { 
      delete *it; 
      it = missle_vector.erase(it); 
     } 
     else 
     it++; 
    } 
    return hit; 
} 
+0

[回答](http://stackoverflow.com/questions/27586288/class-destruction-segfault/27587053#27587053)を参照してください。アルゴリズム関数を使用して、コンテナを保存する必要のないアイテムに分割する必要があります。そこから作業してください。 – PaulMcKenzie

+0

'std :: vector >' ... –

答えて

0

同じ範囲を横断しながら、範囲から何かを消去する(と何かstd::remove_ifのような高レベルを使用していない)のための一般的なパターンは、このようなものです:あなたがない

for (auto it = v.begin(); it != v.end();) 
{ 
    if (pred(it)) { it = v.erase(it); } 
    else   { ++it;    } 
} 

注意forヘッダーのイテレータをインクリメントします。

+0

を使った場合、このコードはかなり短くなりますが、これで2つのイテレータをインクリメントすることはできません。たとえば、ITループのJTループで、条件が満たされていないときは、最初のJTについて他のITをチェックせずにIT + 1にスキップします。 – Volterra

+0

@Volterra:適切な場所で 'break'を使用して、どのループが進行し、どれがスキップするのかを制御できませんか? –

関連する問題