Удаление из вектора в течение сбоев цикла? - PullRequest
0 голосов
/ 07 августа 2009

У меня проблема с циклическим циклом по вектору, и удаление значений из другого вектора иногда приводит к сбою моей программы. У меня есть этот вектор целых, чтобы отслеживать, какие элементы должны быть удалены.

std::vector<int> trEn;

Затем я перебираю этот вектор:

struct enemyStruct {
    float x, y, health, mhealth, speed, turnspeed;
    double angle, tangle;
};
std::vector<enemyStruct> enemies;

Цикл выглядит так:

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;}
        }
    }
}

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

std::reverse( trEn.begin(), trEn.end() );
for ( unsigned int g = 0; g < trEn.size(); g++ ) {
    unsigned int atmp = trEn.at(g);
    if(atmp<=enemies.size()&&atmp>=0)enemies.erase(enemies.begin()+atmp,enemies.begin()+atmp+1);
} trEn.clear();

Сначала я переворачиваю вектор int ´s так, чтобы он шел вперед-назад. Если бы я этого не делал, все значения после trEn[0] были бы недействительными. Это цикл, который дает мне сбой, но только иногда. То, что я пытаюсь сделать, это шутер сверху вниз, и кажется, что, когда нужно убрать много вещей одновременно, он просто падает. Пожалуйста, помогите мне с этим!

Просто спросите, неясно ли мне или что-то пропущено.

Ответы [ 2 ]

4 голосов
/ 07 августа 2009

Единственной, казалось бы, очевидной вещью было бы:

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

Вы уверены, что не имеете в виду (atmp < enemies.size()) здесь? В противном случае ваш код

enemies.erase(enemies.begin()+atmp, ...

наверняка вызовет серьезные проблемы.

2 голосов
/ 07 августа 2009

Ваш первый пример кода - два вложенных цикла - вы перебираете маркеры и для каждого маркера вы перебираете врагов, добавляя вражеские индексы в вектор trEn. Что заставляет вас думать, что содержимое trEn после этого сортируется в порядке возрастания? Для первого маркера вы можете добавить индекс 3, а для второго индекса 2. Вы можете даже добавить один и тот же индекс для разных маркеров. Или я что-то упустил?

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