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
保持敌人。如果有两次射击同时触及敌人,那么它将循环射击并检查它是否触及任何敌人,然后擦除敌人和射击。但是当另一个射击也触及了敌人时,它会试图抹去已经被抹去的敌人
任何的想法 ?
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++;
}
答案 0 :(得分:0)
erase
不会失败。如果您以某种方式将相同的参数再次传递给erase
,那么它将尝试删除其他内容。取决于可能导致其删除您不想要的内容的确切方案,或者如果参数不再有效,可能会导致内存损坏并可能导致程序崩溃。
但是,在你展示的代码片段中,我不认为这是个问题。一旦从矢量中删除了任何敌人,就不会再次遇到环路甚至尝试对其进行测试。
虽然你确实遇到了另一个问题:当一个元素从一个向量中删除时,向量中所有后续元素的索引向下移动1.(如果向量中有4个元素,那么它们将被索引0,1,2,3。如果你擦除索引1处的元素,那么你将剩下3个元素,索引为0,1,2。)你所拥有的代码的结果是当{{1擦除后,另一个元素将向下移动以占据该位置。但循环只是继续并递增indexs
,因此将跳过一个元素。
答案 1 :(得分:0)
使用相同的vRegularShots
从index
删除多次,而不检查index
是否仍在范围内
答案 2 :(得分:0)
您确实想使用Erase-Remove Idiom来执行此操作。