c++ - 循环遍历 vector 时将对象添加到 vector

标签 c++ pointers for-loop vector

我的“级别”类中有一个 GameObject* vector 。

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 循环之前。

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

最佳答案

向 vector 添加新项目可能需要重新分配,如果新的 size会超过 capacity .发生这种情况时,迭代器是 invalidated .

可能的解决方案:

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

关于c++ - 循环遍历 vector 时将对象添加到 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29041499/

相关文章:

c - 我如何知道指针是否指向特定结构?

python - 如何在python中的循环外设置变量

c++ - 使用多态性重载 << 运算符

c - 指向作为操作链表的函数参数的指针

c++ - 嵌套循环 OpenMP 并行化、私有(private)索引还是公共(public)索引?

python - 在 Python 中使用 enumerate() 将索引旋转回 `for` 循环中的第一个元素的更好方法

c++ - MS Visual Studio 2010 Professional Project Designer 没有出现?

c++ - 为什么在大多数平台上没有 'aligned_realloc'?

C++不随机化

c++ - 为什么 `at` 和 `operator []` 没有实现异构比较查找?