STD Map clear()奇怪的行为

Mav*_*rik 2 c++ stdmap map

我用这种方式定义了一个地图:

map<unsigned int, map<unsigned int, std::shared_ptr<MyObject>>> map;
Run Code Online (Sandbox Code Playgroud)

第一张地图预先初始化了一些键和空地图(内部地图).

我有一段用这张地图操作的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

这是一次迭代的可能输出:

1) 2
2) 0
1) 1
2) 0
3) 2
3) 1
Run Code Online (Sandbox Code Playgroud)

所以它似乎clear()并没有真正起作用.

我可以通过更换解决这个问题mapElement.second.clear();map.at(mapElement.first).clear();.

这种行为的原因是什么?

Som*_*ude 10

它'因为你循环复制.更改循环以使用引用:

for(auto& mapElement : map){ ... }
Run Code Online (Sandbox Code Playgroud)