我有这段代码,它抛出一个超出范围的错误。
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())
如果 vector _projVec 为空,它应该为“false”。
“===>”是我得到超出范围错误的地方(因为 _projVec 是空的)。
根据 http://www.cplusplus.com/reference/vector/vector/empty/ vector::empty “返回 vector 是否为空(即它的大小是否为 0)。”
但是,当我运行代码时,它进入第二个 for 循环并抛出超出范围的错误,而我的 vector 为空(它的大小为 0)?
+ _projVec { size=0 } std::vector<Projectile *,std::allocator<Projectile *> >
我想我遗漏了一些东西,所以我想知道这里是否有人可以解决这个问题?
编辑:这是我的 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 所指出的,如果它们从一开始就为空,则不应进行迭代,因此问题可能出在我将索引设置回一次的地方。我还意识到这可能不是一种遍历 vector 的糟糕方法,因此如果有人可以建议我采用不同的方法,我们将不胜感激。
请注意,在这个嵌套的 for 循环中,我希望能够从两个 vector 中删除一个项目。
最佳答案
您有两个嵌套循环修改两个 vector 。虽然从内部 vector 中删除是可以的,但从外部 vector 中删除一个元素则不然(假设外部只有一个元素)
关于c++ - vector::empty() 有问题,还是我遗漏了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20828851/