我以这种方式定义了 map :

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

第一个 map 已使用一些键和空 map (内部 map )进行了预初始化。

我有一段与此 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) 2
2) 0
1) 1
2) 0
3) 2
3) 1

因此,看来clear()并未真正起作用。

我可以通过将mapElement.second.clear();替换为map.at(mapElement.first).clear();来解决此问题。

这种行为的原因是什么?

最佳答案

这是因为您循环复制。更改循环以改为使用引用:

for(auto& mapElement : map){ ... }

关于c++ - STD Map clear()奇怪的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19157034/

10-12 16:50