проверка стирания векторов с ++ - PullRequest
0 голосов
/ 22 августа 2010

Есть ли способ в 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 голосов
/ 22 августа 2010

Может случиться так, что вы несколько раз удалили из vRegularShots, используя тот же index, не убедившись, что index все еще находится в диапазоне

0 голосов
/ 22 августа 2010

Вы действительно хотите использовать Erase-Remove Idiom , чтобы сделать это.

0 голосов
/ 22 августа 2010

erase не сбой. Если вы как-то передадите те же параметры в erase во второй раз, то он попытается удалить что-то еще. В зависимости от точного сценария, который может привести к удалению чего-то, что вы не намеревались, или к повреждению памяти и возможному сбою программы, если параметры больше не действительны вообще.

Однако, во фрагменте кода, который вы показываете, я не вижу в этом проблемы. Как только какой-либо враг будет удален из вектора, петля никогда не столкнется с ним снова, чтобы даже попытаться проверить еще один выстрел против него.

Хотя у вас есть другая проблема: когда элемент стирается из вектора, индексы всех последующих элементов в векторе смещаются вниз на 1. (Если у вас есть 4 элемента в векторе, они будут проиндексированы 0,1,2,3. Если вы удалите элемент с индексом 1, то у вас останется 3 элемента с индексами 0,1,2.) Следствием этого кода будет то, что когда элемент находится на indexs стерт, другой элемент сместится вниз, чтобы занять это место. Но цикл просто продолжается и увеличивает indexs, так что элемент будет пропущен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...