2

私はこのようにマップを定義しました:

map<unsigned int, map<unsigned int, std::shared_ptr<MyObject>>> map;

最初のマップは、いくつかのキーと空のマップ (内部マップ) で事前に初期化されます。

このマップで動作するコードがあります:

for(auto mapElement : map){
  //cout << "1) " << mapElement.second.size() << endl;
  if(mapElement.second.size()>0){
    // do something
  }
  mapElement.second.clear();
  cout << "2) " << mapElement.second.size() << endl;
}
for(auto mapElement : overwrittenMsgs){
  cout << "3) " << mapElement.second.size() << endl;
}

これは、1 回の反復で可能な出力です。

1) 2
2) 0
1) 1
2) 0
3) 2
3) 1

そのため、clear()実際には機能していないようです。

に置き換えることmapElement.second.clear();で問題を解決できますmap.at(mapElement.first).clear();

この動作の理由は何ですか?

4

1 に答える 1

10

これは、コピーでループするためです。代わりに参照を使用するようにループを変更します。

for(auto& mapElement : map){ ... }
于 2013-10-03T10:42:32.950 に答える