2011-09-13 80 views
0

守則:嵌套boost :: unordered_map不更新值?

boost::unordered_map<int, boost::unordered_map<int, float>> map; 
{ 
    boost::unordered_map<int, float> h; 
    h.insert(make_pair(1, 0.5)); 
    map.insert(make_pair(5, h)); 
} 
{ 
    boost::unordered_map<int, float> h = map[5]; 
    h.insert(make_pair(2, 0.6)); 
    map.insert(make_pair(5, h)); 
} 
cout << map[5].size() << endl; 

爲什麼輸出是1不是2? 而當我使用boost :: unordered_map *>來代替時,那麼一切運作良好。 任何人都可以幫助我嗎?

回答

0

下面是在代碼的第二塊會發生什麼:

  1. h = map[5]創建複製內部地圖
  2. h.insert(...)增加了一個值到複製內地圖的
  3. map.insert(...)什麼都不做。 unordered_map::insert inserts an element to the map if and only if there is no element in the map with an equivalent key。但關鍵5已經存在,所以沒有發生插入。您可以通過檢查從插入調用的返回值的布爾部分證實了這一點。

在塊的結尾,複製的地圖被丟棄,和原始內地圖,用一個單一的值,保持在map。因此,您可以得到map [5] .size()== 1的輸出

,但爲什麼我們得到的2的輸出,如果內部映射的值類型設置爲指針,boost::unordered_map<int, float>*?第二個代碼塊這樣做:

  1. h = map[5]將獲得一個指向插入map內的地圖。
  2. h.insert(...)增加了一個值直接內地圖 - 不進副本。此時,已經映射[5] .size()== 2
  3. map.insert(...)還是什麼都不做。但是沒有必要 - 內部地圖已經被修改了。
+0

確切地說是正確的ans.And我也發現使用map [i] [j]我們可以很容易地做指針一樣的事情。而且在我的簡單測試中,它們的效率相等。所以有什麼區別in([] [],insert,emplace)。我知道如果key存在,最後兩個將不會做任何事情。還有更多的區別? – lhdgriver