マップ(std :: map)をループしているときに問題が発生しています。私のループ内マップ上のC++ループがマップの終わりの変化を検出しない
、この同じマップの要素を消去し、時には(常にではない)関数の呼び出しがあります。この関数を使用した後、このマップ情報のいくつかを入力として使用しているコードがあります。この機能は、マップの最後要素が消去されユニーク場合を除いて、すべての要素を消去した後
私は問題のないています。
マイループSEMMSはマップの最後の要素は、それが動作し始めたときと同じではないことを理解すると、クラッシュを作成し、存在doesntの要素を操作しようとしません。
ループの説明にmyMap.end()の呼び出しは、マップの新しいエンド()を使用して自身を更新することができないように私には思えます。
コードの関連部分を以下にリストされている:
for(std::map<int, ConnectionInfo>::iterator kv = myMap.begin(); kv != myMap.end(); ++kv) {
int thisConnectionID=kv->first; //This is where I get garbage when the loop enters when it shouldnt;
ConnectionInfo currentConnectionInfo=kv->second; //This is where I get garbage when the loop enters when it shouldnt;
status=eraseSomeMapElementsIfNecessary(thisConnectionID,currentConnectionInfo.DownPacket); //this function might erase elements on myMap. This generates no problems afterwards, except when the end element of myMap is erased
... //Next parts of the code make no further usage of myMaps, so I just hid it not to pollute the code
}
はkv != myMap.end()
は、内側のループは(消去)MYMAPの最後の要素(最後に)変化していることを理解できていないことを私の解釈です?
この場合、この問題を解決するにはどうすればよいですか?
私の解釈は間違っていますが、ソリューションは以前に述べたこととは何の関係もありません。
ありがとうございました!
必須であるため、コードの '... '部分を表示します。ほとんどの場合、ある時点で無効なイテレータを取得している可能性があります。 –
マップから要素を消去すると、イテレータが無効になる –
erase_ifを使用する方がよい場合があります(実装で提供されている場合)http://en.cppreference.com/w/cpp/experimental/map/erase_if – porges