在遍历std::map时插入元素是否可行?

12

我有一个 Map 需要进行迭代,方法如下:

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

Update() 可能会向 map 中插入元素,甚至从中删除元素,但不一定会执行其中的任何一个操作。很明显它并不是那么工作的。有没有一种方法可以实现这个需求?


1
Update() 可以插入哪些键?如果在迭代器当前位置之前插入了一个新元素,您希望出现什么行为? - Mankarse
Update()能够自我移除吗? - hmjd
@hmjd 目前它可以,是的。 - tschaei
@Mankarse,抱歉我不明白你的第一个问题。在Update()中,完全有可能插入一个全新的键值对到映射表中。至于你的第二个问题,无论是否调用Update()都没有太大关系。 - tschaei
@tschaei:我的问题表述得不太好,但你的回答基本上已经涵盖了它(; - Mankarse
2个回答

14

来自std::map::erase():

被删除元素的引用和迭代器将失效,其他引用和迭代器不会受到影响。

来自std::map::insert():

没有引起迭代器或引用的失效。

来自std::map::operator[]:

没有引起迭代器或引用的失效。

如果Update()不会删除自身,那么代码是合法的。如果Update()会删除自身,则不合法。Update()需要通知调用代码是否已经删除自身,可以通过设置标志或返回下一个迭代器来实现(如Attila所建议的)。


谢谢。这意味着我将不得不在我的GameObject类中添加一个布尔类型的_erase变量,它会在Update()方法中设置,然后让循环处理元素的删除。 - tschaei

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接