C++ 迭代器错误中的向量迭代器
为我的投资组合制作小行星游戏。游戏中遇到一个错误,使用下面的代码块。错误只是迭代器不可延迟,但我已经缩小了错误范围。在我向您展示代码之后,我将讨论这一点:C++ 迭代器错误中的向量迭代器,c++,iterator,stdvector,2d-games,C++,Iterator,Stdvector,2d Games,为我的投资组合制作小行星游戏。游戏中遇到一个错误,使用下面的代码块。错误只是迭代器不可延迟,但我已经缩小了错误范围。在我向您展示代码之后,我将讨论这一点: void Game::Update() { if (elapsedTime > REFRESH_RATE) { player->Update(elapsedTime); std::vector<Asteroid*>::iterator iterator= bigAsteroids.begin();
void Game::Update()
{
if (elapsedTime > REFRESH_RATE)
{
player->Update(elapsedTime);
std::vector<Asteroid*>::iterator iterator= bigAsteroids.begin();
std::vector<Bullet*>::iterator iter = bullets.begin();
// *********************** //
while (iterator!= bigAsteroids.end())
{
if (*iterator != nullptr) // Checks to see if player is colliding with an asteroid and updates the asteroid
{
player->CheckCollisionsAsteroid( *iterator );
// *********************** // Checks to see if bullet is colliding with asteroid
while (iter != bullets.end())
{
if (*iter != nullptr)
{
if ((*iter)->CheckCollisionsAsteroid( **iterator ))
{
size_t i = iterator - bigAsteroids.begin();
iter = bullets.erase(iter);
iterator = bigAsteroids.erase(iterator);
printf("\nAsteroid destroyed at position %i", i);
}
else
{
++iter;
}
}
}
iter = bullets.begin(); // Reset the bullet iterator else we'd only get to check 1 asteroid
// *********************** //
if (*iterator != nullptr && iterator != bigAsteroids.end()) { (*iterator)->Update(elapsedTime); }
}
if (*iterator != nullptr && (iterator!= bigAsteroids.end()))
{++iterator;}
}
// *********************** //
Clock.Reset();
}
}
void Game::Update()
{
如果(elapsedTime>刷新率)
{
玩家->更新(elapsedTime);
std::vector::iterator iterator=bigstrobes.begin();
std::vector::iterator iter=bullets.begin();
// *********************** //
while(迭代器!=bigstrobes.end())
{
if(*iterator!=nullptr)//检查玩家是否与小行星碰撞并更新小行星
{
player->CheckCollisionsAsteroid(*迭代器);
//***********************检查子弹是否与小行星相撞
while(iter!=bullets.end())
{
如果(*iter!=nullptr)
{
if((*iter)->CheckCollisionsAsteroid(**迭代器))
{
size_t i=迭代器-bigstrobes.begin();
iter=子弹。擦除(iter);
迭代器=大小行星。擦除(迭代器);
printf(“\n在位置%i,i处销毁的甾体);
}
其他的
{
++iter;
}
}
}
iter=bullets.begin();//重置bullet迭代器,否则我们只能检查1颗小行星
// *********************** //
如果(*iterator!=nullptr&&iterator!=bigstrobes.end()){(*iterator)->更新(elapsedTime);}
}
if(*iterator!=nullptr&&(iterator!=bigstrobes.end())
{++迭代器;}
}
// *********************** //
时钟复位();
}
}
如果这一切看起来有点混乱,这里有一个简单的解释:
当迭代器通过每个小行星时,我检查播放器是否与每个小行星碰撞。目前这没有任何作用
然后我迭代我的子弹向量,检查每颗子弹与当前小行星的对比。如果发生碰撞,我将删除子弹和小行星,并打印出被摧毁的小行星在矢量中的位置
一旦我完成了,我就为下一颗小行星重置了bullet iter
目前我的主要问题是(*迭代器)调用更新问题是,当您销毁最后一颗小行星时,
迭代器
将设置为bigstrobes.end()
(通过分配给erase()
的结果)。然后在内部while
循环终止后,取消对迭代器的引用。无法取消对结束迭代器的引用
您必须切换支票的顺序:
if (iterator != bigAsteroids.end() && *iterator != nullptr)
如果你根据迭代器的引用来命名,例如,itAsteroid
和itBullet
@Angew,这将大大有助于代码的可读性哈哈,我一直在重写代码,所以目前在“iter”或“iterator”上键入Bulletter或Asteriter…:P最终版本将实现这些功能,谢谢。还有鲍勃,嗯。。我会再打给你的,谢谢你的帮助。这不是最后一颗小行星。这可能是我拍摄的第一颗小行星。如果它是矢量中的最后一颗小行星(如最后一颗小行星),则会抛出错误。我想我目前还没有找到一颗小行星去拍摄!HahaHe的意思是:当您调用bigstrobes.erase(迭代器)
时,iterator
设置为bigstrobes.end()
<代码>*迭代器!=nullptr
将失败并且迭代器!=bigstrobes.end()
将返回false
,因此切换条件的顺序,您应该会很好。我懂了。我确实改变了它:if(itAsteroid!=bigstrobes.end()){(*itAsteroid)->Update(elapsedTime);}
这仍然会导致错误。但是,我随后更改了下面的一行:if(itAsteroid!=bigstrobes.end()&&&*itAsteroid!=nullptr){++itAsteroid;}
,它按照您所说的做了。我对你们做了什么:P谢谢你们两个!