0

STLマップをループして要素を削除し、クリーンアップを行っています。残念ながら、私のプログラムは++iter行でクラッシュします。マップをループする方法に何か問題がありますか?

std::map<string,BoneHierarchy* >::iterator iter = boneMap.begin();
while(iter != boneMap.end()) {
    string playerName = iter->first;
    boneMap[playerName]->clear();
    boneQueue->push(boneMap[playerName]);
    boneMap.erase(iter);
    ++iter;
}
4

2 に答える 2

6

イテレータを削除した後はインクリメントしないでください(イテレータは消去されているので、どのようにインクリメントできると思いますか?)。次のコマンドでイテレータのコピーを消去します。

boneMap.erase(iter++);

またはします

iter = boneMap.erase(iter);

C++11を使用している場合。

forループを介したC ++マップからの要素の削除も参照してください)

于 2012-04-21T15:55:12.757 に答える
3
boneMap.erase(iter);
++iter;                     //incorrect

次のように書く必要があります:

iter = boneMap.erase(iter); //correct (in C++11)
//no need to increment!

map::erase()消去されたアイテムの後にイテレータを返すためです。

于 2012-04-21T15:55:16.363 に答える