我有这段代码,这会引发超出范围的错误。
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())
应该是&#34; false&#34;如果向量_projVec为空。
&#34; ===&gt;&#34;是我得到超出范围的错误(因为_projVec为空)。
根据http://www.cplusplus.com/reference/vector/vector/empty/ vector :: empty&#34;返回向量是否为空(即其大小是否为0)。&#34;
然而,当我运行代码时,它进入第二个for-loop抛出一个超出范围的错误,而我的向量是空的(它的大小是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指出的那样,如果它们从一开始就是空的,它就不应该迭代,所以问题可能在于我将索引设置回一次。我也意识到这可能是迭代向量的一种不好的方法,所以如果有人可以建议我采用不同的方法,那将非常感激。
请注意,在这个嵌套的for循环期间,我希望能够从两个向量中删除一个项目。
答案 0 :(得分:3)
你有两个嵌套循环修改两个向量。虽然从内部向量中删除很好,但是从外部向量中删除元素不是(假设外部只有一个元素)
答案 1 :(得分:1)
可能DestroyProj()
(或其他功能之一)修改_projVec
。因此,即使它在循环开始时不为空,但在删除项目时它可能会变空。
答案 2 :(得分:0)
您应该迭代向量的副本,或者您应该记住要删除哪些索引,然后在最后删除它们。不要让DestroyProj
和DestroyShip
修改向量。