2012-04-21 4 views
0

要素を削除してクリーンアップするためにSTLマップをループしています。残念ながら、私のプログラムは+ + iter行でクラッシュします。私はマップ上でどのようにループしているかに間違ったことをしていますか?要素を削除するときにSTLマップのイテレータを使用するのに問題がある

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; 
} 
+0

イテレータは読んだり修正する必要があると思います。削除すると、進行中の反復が壊れてしまいます。 – kenny

+0

http://stackoverflow.com/q/6438086/893693 – inf

答えて

6

は、(それが消去されていますので、どのようにあなたがそれをインクリメントすることを期待できますか?)それを削除した後、イテレータをインクリメントしないでください。反復子のコピーを消去:

boneMap.erase(iter++); 

またはC++ 11を使用している場合

iter = boneMap.erase(iter); 

を行います。

(もRemoving elements from a C++ map through a for-loop参照)

3
boneMap.erase(iter); 
++iter;      //incorrect 

のように記述する必要があります:map::erase() returns iterator following the erased itemので

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

+1

'map :: erase(iterator position)'は 'void'を返します。 – jpm

+1

@jpm:それはもう存在しません(C++ 11では)。 C++ 11では、イテレータを返します。 – Nawaz

+1

きちんとした、私はそのアップデートに精通していませんでした。情報をありがとう。また、+1。 – jpm

関連する問題