2009-08-07 12 views
0

私はベクター上でループすることに問題があり、別のベクターから値を削除すると、プログラムがクラッシュすることがあります。私はどの要素を削除すべきかを追跡するintのベクトルを持っています。forループのクラッシュでベクターから削除しますか?

std::vector<int> trEn; 

そこで私は、このベクトルをループ:ループはこのようになります

struct enemyStruct { 
    float x, y, health, mhealth, speed, turnspeed; 
    double angle, tangle; 
}; 
std::vector<enemyStruct> enemies; 

for (unsigned int i = 0; i < bullets.size(); i++) { 
    for (unsigned int j = 0; j < enemies.size(); j++) { 
     if (bullets[i].x > enemies[j].x-10 && bullets[i].x < enemies[j].x+10 && bullets[i].y > enemies[j].y-10 && bullets[i].y < enemies[j].y+10) 
     { 
      enemies[j].health-=bullets[i].dmg; 
      if(enemies[j].health<=0){trEn.push_back(j);break;} 
     } 
    } 
} 

弾丸ベクトルが敵ベクトルに似てちょうど別のベクトルであるが、弾丸とその中に。それは問題ではないようです。このコードはすべてうまくいきますが、実際には敵のベクトルのアイテムを削除するときにプログラムがクラッシュすることがあります。それは後ろから前に行くように

std::reverse(trEn.begin(), trEn.end()); 
for (unsigned int g = 0; g < trEn.size(); g++) { 
    unsigned int atmp = trEn.at(g); 
    if(atmp<=enemies.size()&&atmp>=0)enemies.erase(enemies.begin()+atmp,enemies.begin()+atmp+1); 
} trEn.clear(); 

まず私はint年代のベクトルを逆に。もし私がdid'ntすれば、trEn[0]の後のすべての値は無効になります。 これは私にクラッシュを与えるループですが、ときどきのみです。私がしようとしているのは、トップダウンシューティングゲームです。同時に多くのものを取り除くと、ちょうどクラッシュするようです。これで私を助けてください!

不明な点があるのか​​、不足していることがあるかどうかを確認してください。

答えて

4

だけ一見明白なことは、次のようになります。

if(atmp<=enemies.size() ... 

あなたはここに(atmp < enemies.size())を意味するものではありませんか?そうでなければあなたのコード

enemies.erase(enemies.begin()+atmp, ... 

確かにいくつかの深刻な問題が発生します。

+0

実際には、それはおそらくアトムが> Enimiesのサイズより大きいとは限りません。 –

+0

残りのコードには多すぎます(図示されていません)。しかし、この質問の文脈のために、私はOPにおそらくそれが念頭に置かれていることに同意します。 – gimpf

+0

私はアサーションが、プログラムがエラーとしてキャッチしなければならないと思うなら、私は正しいでしょうか?私はそのような初心者です... – Mariamario

2

最初のコードサンプルは、2つのネストループです。弾丸を繰り返し、敵を繰り返して敵のインデックスをtrEnベクターに追加します。その後、trEnの内容が昇順でソートされていると思いますか?最初の箇条書きの場合は、インデックス3を追加し、2番目のインデックス2を追加できます。異なる箇条書きに同じインデックスを追加することもできます。または私は何かを逃していますか?

+0

ああ、それは良い点だと思っていませんでした。実際、私はちょうど、敵の大群の真ん中の敵が、私が前面にあるものを撃っているときに消えてしまうことに気付きました。それは整数のベクトルなので、ソートするのは簡単です。並べ替えを行うための標準的な関数がいくつかありますか? – Mariamario

+1

std :: sortは次のようになります:-) –

+0

ありがとう、それは今ではうまくいきます:) – Mariamario

関連する問題