C++向量擦除检查
问题描述:
C++中有检查擦除成功的方法吗?
我有两段代码擦除同一个对象。第一次擦除对象,然后第二次擦除它,但没有找到对象。 任何想法?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++;
}
答
erase
不会失败。如果你第二次以相同的参数传递erase
,那么它会尝试删除其他东西。根据可能导致它删除您不想要的内容的确切场景,或者如果参数不再有效,可能会导致内存损坏并可能导致程序崩溃。
但是,在你展示的代码片段中,我没有看到这是问题。一旦任何敌人从矢量中消失,循环将无法再次遇到它,甚至不会尝试再次对它进行测试。
虽然你确实有一个不同的问题:当一个元素从一个向量中被擦除时,向量中所有后续元素的索引向下移动1(如果向量中有4个元素,那么它们会是索引0,1,2,3。如果擦除索引1处的元素,那么您将有3个元素留下索引0,1,2)。您拥有的代码的后果是当indexs
处的元素是消除,另一个元素将下移到这个地方。但循环只是继续并增加indexs
,并且一个元素将被跳过。
答
它可能发生,你使用相同的index
从vRegularShots
抹去了几次都没有检查出index
仍处于范围
请提供一些演示您所遇问题的示例代码。 – 2010-08-22 05:42:57
什么是'脚本'? C++代码通常不被称为脚本,反正矢量不会在程序终止时停留... – bdonlan 2010-08-22 05:51:17
我编辑我的文章。 – Ramilol 2010-08-22 05:55:55