10

我有一个 Map ,我像这样迭代它:

std::map<unsigned int, GameObject *>::iterator itr = _gameObjects.begin();
    while (itr != _gameObjects.end())
    {
        itr->second->Update();
        itr++;
    }

Update() 可能会在地图中插入一个元素,甚至从中删除一个元素,但它不一定会执行这两者中的任何一个。它显然不是那样工作的。有没有办法可以做到?

4

2 回答 2

13

来自std::map::erase()

对已擦除元素的引用和迭代器无效。其他引用和迭代器不受影响。

来自std::map::insert()

没有迭代器或引用无效。

来自std::map::operator[]

没有迭代器或引用无效。

如果Update()不删除自身,则代码是合法的。如果Update()是,那么它不是。Update()如果调用代码自行删除,则需要通知调用代码,设置标志或返回下一个迭代器(如Attila建议的那样)。

于 2012-05-22T17:00:49.473 回答
2

STL 中的erase函数通常返回一个指向下一个有效元素的迭代器(或者end()如果没有这样的元素可用)。您可以从返回此迭代器Update并将其重新分配给itr

于 2012-05-22T17:01:31.750 回答