tschaei
tschaei

Reputation: 317

Inserting into std::map while iterating over it?

I have a Map over which I iterate like this:

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

Update() might insert an element into the map or even remove one from it, but it doesn't necessarily do any of the two. It obviously doesn't work like that. Is there a way it can be done?

Upvotes: 12

Views: 10435

Answers (2)

hmjd
hmjd

Reputation: 122011

From std::map::erase():

References and iterators to the erased elements are invalidated. Other references and iterators are not affected.

From std::map::insert():

No iterators or references are invalidated.

From std::map::operator[]:

No iterators or references are invalidated.

If Update() does not remove itself, then the code is legal. If Update() does, then it is not. Update() would be required to inform the calling code if it removed itself, either setting a flag or returning the next iterator (as suggested by Attila).

Upvotes: 14

Attila
Attila

Reputation: 28802

The erase function in STL usually returns an iterator to the next valid element (or end() if no such element is available). You could return this iterator from Update and re-assign it to itr

Upvotes: 2

Related Questions