vector :: empty()有问题,或者我错过了什么?

时间:2013-12-29 18:56:13

标签: c++ vector

我有这段代码,这会引发超出范围的错误。

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循环期间,我希望能够从两个向量中删除一个项目。

3 个答案:

答案 0 :(得分:3)

你有两个嵌套循环修改两个向量。虽然从内部向量中删除很好,但是从外部向量中删除元素不是(假设外部只有一个元素)

答案 1 :(得分:1)

可能DestroyProj()(或其他功能之一)修改_projVec。因此,即使它在循环开始时不为空,但在删除项目时它可能会变空。

答案 2 :(得分:0)

您应该迭代向量的副本,或者您应该记住要删除哪些索引,然后在最后删除它们。不要让DestroyProjDestroyShip修改向量。