簡體   English   中英

vector :: empty()錯誤,還是我錯過了什么?

[英]vector::empty() bugged, or am I missing something?

我有這段代碼,它引發了超出范圍的錯誤。

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);
                }
            }
        }
    }

請注意,如果向量_projVec為空,我如何獲得if (!_projVec.empty())應該為“ false”的信息。

“ ===>”是我超出范圍的錯誤的地方(因為_projVec為空)。

“根據http://www.cplusplus.com/reference/vector/vector/empty/ vector :: empty”返回向量是否為空(即其大小是否為0)。

但是,當我運行代碼時,它進入了第二個for循環,引發了超出范圍的錯誤,而我的向量為空(其大小為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循環中,我希望能夠從兩個向量中刪除一個項目。

您有兩個修改兩個向量的嵌套循環。 雖然從內部向量中擦除很好,但是從外部向量中擦除元素不是(假設外部只有一個元素)

大概DestroyProj() (或其他函數之一)修改_projVec 因此,即使在循環開始時它不為空,但在刪除項目時它也可能變為空。

您應該遍歷向量的副本,或者應該記住要刪除的索引,然后在最后刪除它們。 不要讓DestroyProjDestroyShip修改向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM