迭代器错误中的向量迭代器

时间:2013-02-22 11:34:14

标签: c++ iterator stdvector 2d-games

为我的投资组合工作小行星游戏。使用以下代码块跨越错误进行游戏。错误只是迭代器不可用,但我缩小了错误。在我向你展示代码之后我会谈到这个:

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

如果一切看起来有些混乱,这里有一个简短的解释:

当迭代器穿过每个小行星时,我会检查玩家是否与每个小行星相撞。 目前无效

然后我遍历我的子弹矢量,检查每个子弹对抗当前的小行星。如果发生碰撞,我会破坏子弹和小行星的擦除,并打印出被摧毁的小行星在矢量中所处的位置。

一旦我完成了这件事,我就会为下一个小行星重置子弹。

目前我的主要问题是(* iterator)&lt; - asteroid对Update的调用。

当我擦除小行星矢量中的最后一个物体时,问题才会出现。我知道erase返回一个迭代器到下一个对象 - 如果下一个对象不存在,将抛出一个错误(因为迭代器指向一个nullptr,对吗?)。我正在检查nullptr无济于事。

有人可以提供任何建议或帮助吗?非常感谢,一直在挠头几个小时!

1 个答案:

答案 0 :(得分:1)

问题在于,当您销毁最后一颗小行星时,iterator将设置为bigAsteroids.end()(通过分配给erase()的结果)。然后在内部while循环终止后,您取消引用iterator。无法取消引用过去的迭代器。

你必须改变支票的顺序:

if (iterator != bigAsteroids.end() && *iterator != nullptr)