在循环遍历矢量时将对象添加到矢量

Adding an object to a vector whilst looping through it

本文关键字:对象 添加 循环 遍历      更新时间:2023-10-16

我的"Level"类中有一个GameObject*向量。

vector<GameObject*> gameObjects;

我像这样向 Vector 添加一个对象:

gameObjects.push_back(new Laser(10, 30));

其中LaserGameObject的子班。然后我像这样循环遍历它们:

void Level::update() 
{
    for(vector<GameObject*>::const_iterator i = gameObjects.begin(); i != gameObjects.end(); ++i) {
        (*i)->update();
    }
}

其中void update()是类 GameObject 的成员函数。现在,在某一时刻,我可能会更新一个对象,例如"枪",这会在其过程中创建另一个对象,例如"子弹",如下所示:

level.gameObjects.push_back(new Bullet(position, rotation));

其中level是"Level"类的实例。这行代码只是找到,但是在该"帧"的末尾,当level.update()完成对现有GameObject的循环时,它会崩溃。这发生在它退出 for 循环之前。

为什么它会崩溃,我该如何解决这个问题?

如果新大小超出容量,则向矢量添加新项可能需要重新分配。 发生这种情况时,迭代器将失效。

潜在的解决方案:

  • 使用索引进行迭代以直接访问矢量元素(最简单的解决方案)
  • 在开始使用迭代器之前,请确保预留了足够的容量(并非总是可能的)。