[英]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
。 因此,即使在循環開始時它不為空,但在刪除項目時它也可能變為空。
您應該遍歷向量的副本,或者應該記住要刪除的索引,然后在最后刪除它們。 不要讓DestroyProj
和DestroyShip
修改向量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.