Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从for循环崩溃中的向量中删除?_C++_Loops_For Loop_Memory Management_Vector - Fatal编程技术网

C++ 从for循环崩溃中的向量中删除?

C++ 从for循环崩溃中的向量中删除?,c++,loops,for-loop,memory-management,vector,C++,Loops,For Loop,Memory Management,Vector,我在一个向量上循环时遇到问题,从另一个向量上删除值有时会使我的程序崩溃。我有这个int向量来跟踪哪些元素应该被删除 std::vector<int> trEn; std::vector trEn; 然后我循环通过这个向量: struct enemyStruct { float x, y, health, mhealth, speed, turnspeed; double angle, tangle; }; std::vector<enemyStruct>

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

std::vector<int> trEn;
std::vector trEn;
然后我循环通过这个向量:

struct enemyStruct {
    float x, y, health, mhealth, speed, turnspeed;
    double angle, tangle;
};
std::vector<enemyStruct> enemies;
struct-enemyStruct{
浮动x,y,健康,mhealth,速度,旋转速度;
双角,缠结;
};
病媒天敌;
循环如下所示:

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;}
        }
    }
}
for(无符号int i=0;i敌人[j].x-10&&bullets[i].x<敌人[j].x+10&&bullets[i].y>敌人[j].y-10&&bullets[i].y<敌人[j].y+10)
{
敌人[j].生命-=子弹[i].dmg;

如果(敌人[j].健康唯一看起来显而易见的事情是:

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

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

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

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


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

您的第一个代码示例是两个嵌套的循环-您迭代子弹,对于每个子弹,您迭代敌人,将敌人的索引添加到trEn vector中。您怎么会认为trEn的内容是按升序排序的?对于第一个子弹,您可以添加索引3,对于第二个子弹,您可以添加索引3dex 2.你甚至可以为不同的项目符号添加相同的索引。或者我遗漏了什么?

你的第一个代码示例是两个嵌套的循环-你迭代项目符号,每个项目符号你迭代敌人,将敌人的索引添加到trEn向量。你怎么会认为trEn的内容是按升序排序的?对于第一个项目符号,你可以可以添加索引3,对于第二个索引2,甚至可以为不同的子弹添加相同的索引。或者我丢失了什么东西?

啊,这是一个很好的点,没有想到。事实上,我意识到敌人部落中的敌人在我射击前面的敌人时会消失,这意味着排序被搞乱了。y、 因为它是一个整数向量,所以应该很容易排序。是否有一些标准函数来进行排序,或者我应该自己进行排序?我想std::sort可以:-)看起来有时候它仍然会移除不止一个敌人,很明显这是因为向量中有重复的条目。有什么神奇的功能可以移除这些吗?你可能想使用std::set。它是排序的,元素是唯一的。啊,这是一个很好的观点,没有想到。事实上我刚刚意识到敌人我在我向前线的敌人开火时,敌人部落的中部可能会消失,这意味着排序会被打乱。因为它是一个整数向量,所以应该很容易排序。是否有一些标准函数来进行排序,或者我应该自己做排序?我想std::sort可以:-)似乎它仍然删除了超过有时是一个敌人,很明显,这是因为向量中存在重复的条目。是否也有一些神奇的功能来删除这些条目?您可能需要使用std::set。它是排序的,并且它的元素是唯一的。实际上-这可能是一个断言,而不是一个条件,因为我可以告诉您,它永远不可能r atmp大于enimies的大小。太依赖于未显示的代码的其余部分。但是对于这个问题的上下文,我同意OP可能已经考虑到了这一点。如果我认为该断言意味着如果atmp>敌人的大小是不可能的,程序应该将其作为错误捕获,我是对的吗?我是一个新手有时……我这里所说的断言是指,在使用if语句时,有一种隐含的期望,即“if”的条件有时可能是错误的。然而,在我看来,它永远不应该是错误的。如果生成的代码需要“if”,那么它只是隐藏了一个缺陷。我会将此更改为“assert(!atmp>=enimies.size())”或者可以使用“if”,但如果不能立即死亡则抛出异常:“if(atmp=>enimies.size())throw serioserrorincode();”.BTW,其他人对断言-实际上是签出-有不同的意见,这可能是一个断言,而不是一个条件,因为我可以告诉你,atmp永远不可能大于等于enimies的大小。这太依赖于代码的其余部分,没有显示出来。但是对于这个问题的上下文,我同意OP可能是这么想的。如果我认为断言意味着程序应该在atmp>敌人的大小时将其捕获为错误,那么我是对的,因为这是不可能的吗?我有时候是个新手……我这里所说的断言的意思是,在使用if语句时,有一个隐含的期望,即“if”的条件有时可能是错误的。但是,在我看来,它永远不应该是错误的。如果生成的代码需要“If”,那么它只是隐藏了一个缺陷。我会将其更改为“assert(!atmp>=enimies.size())”或者使用“If”,但如果不能立即死亡,则抛出异常:“If(atmp=>enimies.size())抛出SerioUserErrorCode()顺便说一句,其他人对断言校验有不同的看法
enemies.erase(enemies.begin()+atmp, ...