在迭代时插入std :: map?

时间:2012-05-22 16:53:31

标签: c++ stdmap

我有一个地图,我会像这样迭代:

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

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

2 个答案:

答案 0 :(得分:5)

来自std::map::erase()

  

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

来自std::map::insert()

  

没有迭代器或引用无效。

来自std::map::operator[]

  

没有迭代器或引用无效。

如果Update()没有删除,那么代码是合法的。如果Update()有,那就不是。 Update()需要通知调用代码是否自行删除,设置标志或返回下一个迭代器(如Attila所示)。

答案 1 :(得分:1)

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