vector :: empty () прослушивается, или я что-то упустил?

0

У меня есть эта часть кода, которая выдает ошибку вне диапазона.

if (!_enemyVec.empty())
    {
        for (std::vector<EnemyShip*>::size_type i = 0; i != _enemyVec.size(); i++)
        {
            if (!_projVec.empty())
            {
                for (std::vector<Projectile*>::size_type y = 0; y != _projVec.size(); y++)
                {
                    ===>_projVec[y]->CheckCollision(_enemyVec[i]);
                    if (_projVec[y]->Destroy())
                        DestroyProj(y);
                    if (_enemyVec[i]->Destroy())
                        DestroyShip(i);
                }
            }
        }
    }

Обратите внимание, что у меня есть if (!_projVec.empty()) который должен быть "ложным", если вектор _projVec пуст.

"===>" - это то, где я получаю свою ошибку вне диапазона (поскольку _projVec пуст).

Согласно http://www.cplusplus.com/reference/vector/vector/empty/ vector :: empty "Возвращает, является ли вектор пустым (т.е. Является ли его размер равным 0)".

Однако, когда я запускаю код, он переходит во второй цикл for-loop, выдавая ошибку вне диапазона, в то время как мой вектор пуст (размер равен 0)?

+       _projVec    { size=0 }  std::vector<Projectile *,std::allocator<Projectile *> >

Я думаю, что у меня что-то не хватает, поэтому мне интересно, может ли кто-нибудь здесь это прояснить?

EDIT: Вот мои функции DestroyProj/Ship.

void ObjectManager::DestroyShip(std::vector<EnemyShip*>::size_type &index)
{
    delete _enemyVec[index];
    _enemyVec[index] = nullptr;
    _enemyVec.erase(_enemyVec.begin() + index);
    index--;
    AddScore(10);
}

void ObjectManager::DestroyProj(std::vector<Projectile*>::size_type &index)
{
    delete _projVec[index];
    _projVec[index] = nullptr;
    _projVec.erase(_projVec.begin() + index);
    index--;
}

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

Обратите внимание, что во время этого вложенного цикла for я хочу иметь возможность удалить элемент из обоих векторов.

  • 3
    мы можем с уверенностью сказать, что вы что-то упустили. Предположение, что невозможное никогда не помогает.
  • 0
    Вам даже не нужно проверять, являются ли векторы пустыми, потому что если они есть, он будет повторяться ноль раз, что ничего не изменит с вашими векторами.
Теги:
vector

3 ответа

3
Лучший ответ

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

  • 0
    Это была ошибка, я переместил стирание внешнего вектора во внешний цикл for. Спасибо!
1

Вероятно, DestroyProj() (или одна из других функций) изменяет _projVec. Поэтому, даже если он не был пустым в начале цикла, он может стать пустым при удалении проектов.

  • 1
    То же самое относится и к _enemyVec .
0

Вы должны перебирать копию векторов, или вы должны помнить, какие индексы удалить, а затем удалить их в конце. Не позволяйте DestroyProj и DestroyShip изменять вектор.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню