10

私は次のように繰り返すマップを持っています:

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

Update()は、要素をマップに挿入したり、マップから1つ削除したりする場合がありますが、必ずしも2つのうちのいずれかを実行するわけではありません。それは明らかにそのようには機能しません。それを行う方法はありますか?

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 に答える