У меня есть эта часть кода, которая выдает ошибку вне диапазона.
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 я хочу иметь возможность удалить элемент из обоих векторов.
У вас есть два вложенных цикла, изменяющих два вектора. Хотя удаление из внутреннего вектора является прекрасным, стирание элемента из внешнего вектора не является (предположим, что внешний имеет только один элемент)
Вероятно, DestroyProj()
(или одна из других функций) изменяет _projVec
. Поэтому, даже если он не был пустым в начале цикла, он может стать пустым при удалении проектов.
_enemyVec
.
Вы должны перебирать копию векторов, или вы должны помнить, какие индексы удалить, а затем удалить их в конце. Не позволяйте DestroyProj
и DestroyShip
изменять вектор.