从for中删除for循环崩溃?

时间:2009-08-07 10:16:44

标签: c++ loops for-loop memory-management vector

我在向量循环时遇到问题,从另一个向量中删除值有时会导致我的程序崩溃。我有这个int的向量来跟踪应该删除哪些元素。

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的向量反转,使其从后向前移动。如果我没有这样做,trEn[0]之后的所有值都将无效。 这是一个让我崩溃的循环,但有时只是。我想要做的是一个自上而下的射击游戏,似乎当很多事情应该被删除同时它只是崩溃。请帮帮我!

请问我是否不清楚或是否有任何遗漏。

2 个答案:

答案 0 :(得分:4)

唯一看似显而易见的事情是:

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

你确定在这里不是(atmp < enemies.size())吗?否则你的代码

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

肯定会产生一些严重的问题。

答案 1 :(得分:2)

你的第一个代码示例是两个嵌套循环 - 你迭代子弹,每个子弹你迭代敌人将敌人索引添加到trEn向量。是什么让你觉得trEn的内容在那之后按升序排序?对于第一个项目符号,您可以添加索引3,对于第二个索引2.您甚至可以为不同的项目符号添加相同的索引。或者我错过了什么?

相关问题