2013-10-03 76 views
2

我這樣定義的地圖:STD地圖清楚()的奇怪行爲

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) 2 
2) 0 
1) 1 
2) 0 
3) 2 
3) 1 

如此看來,clear()是不是真的工作。

我可以通過將mapElement.second.clear();替換爲map.at(mapElement.first).clear();來解決問題。

這種行爲的原因是什麼?

回答

10

它'因爲你循環副本。更改回路以代替使用參考:

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