c ++矢量擦除检查

时间:2010-08-22 05:40:16

标签: c++ vector

C ++中是否有办法检查擦除是否成功? 我有两段代码擦除同一个对象。第一个擦除了对象,然后第二个擦除它但没有找到对象。 有什么想法吗?

for(long indexs=0; indexs < (long)Enemie1.vS2Enemie1.size(); indexs++)
  {
   if((vRegularShots[index].x>=Enemie1.vS2Enemie1[indexs].x && vRegularShots[index].y>=Enemie1.vS2Enemie1[indexs].y && vRegularShots[index].y<=(Enemie1.vS2Enemie1[indexs].y+17) && vRegularShots[index].x<=(Enemie1.vS2Enemie1[indexs].x+17))||(Enemie1.vS2Enemie1[indexs].x>=vRegularShots[index].x && Enemie1.vS2Enemie1[indexs].y>=vRegularShots[index].y && Enemie1.vS2Enemie1[indexs].y<=(vRegularShots[index].y+16) && Enemie1.vS2Enemie1[indexs].x<=(vRegularShots[index].x+5)))
   {
    Enemie1.vS2Enemie1.erase(Enemie1.vS2Enemie1.begin()+indexs);
    vRegularShots.erase(vRegularShots.begin()+index);
    score+=100;
   }
}

vregularshots保留已发射的镜头,vS2Enemie1保持敌人。如果有两次射击同时触及敌人,那么它将循环射击并检查它是否触及任何敌人,然后擦除敌人和射击。但是当另一个射击也触及了敌人时,它会试图抹去已经被抹去的敌人 任何的想法 ?

<小时/> UPDATE

for(long indexs=0; indexs < (long)Enemie1.vS1Enemie1.size();)
  {
   if((vRegularShots[index].x>=Enemie1.vS1Enemie1[indexs].x && vRegularShots[index].y>=Enemie1.vS1Enemie1[indexs].y && vRegularShots[index].y<=(Enemie1.vS1Enemie1[indexs].y+17) && vRegularShots[index].x<=(Enemie1.vS1Enemie1[indexs].x+17))||(Enemie1.vS1Enemie1[indexs].x>=vRegularShots[index].x && Enemie1.vS1Enemie1[indexs].y>=vRegularShots[index].y && Enemie1.vS1Enemie1[indexs].y<=(vRegularShots[index].y+16) && Enemie1.vS1Enemie1[indexs].x<=(vRegularShots[index].x+5)))
   {
    Enemie1.vS1Enemie1.erase(Enemie1.vS1Enemie1.begin()+indexs);
    vRegularShots.erase(vRegularShots.begin()+index);
    score+=100;
   }
   else 
    indexs++;
  }

3 个答案:

答案 0 :(得分:0)

erase不会失败。如果您以某种方式将相同的参数再次传递给erase,那么它将尝试删除其他内容。取决于可能导致其删除您不想要的内容的确切方案,或者如果参数不再有效,可能会导致内存损坏并可能导致程序崩溃。

但是,在你展示的代码片段中,我不认为这是个问题。一旦从矢量中删除了任何敌人,就不会再次遇到环路甚至尝试对其进行测试。

虽然你确实遇到了另一个问题:当一个元素从一个向量中删除时,向量中所有后续元素的索引向下移动1.(如果向量中有4个元素,那么它们将被索引0,1,2,3。如果你擦除索引1处的元素,那么你将剩下3个元素,索引为0,1,2。)你所拥有的代码的结果是当{{1擦除后,另一个元素将向下移动以占据该位置。但循环只是继续并递增indexs,因此将跳过一个元素。

答案 1 :(得分:0)

使用相同的vRegularShotsindex删除多次,而不检查index是否仍在范围内

答案 2 :(得分:0)

您确实想使用Erase-Remove Idiom来执行此操作。

相关问题