2011-09-13 43 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