Nested 嵌套boost::无序的_映射不更新值?

Nested 嵌套boost::无序的_映射不更新值?,nested,unordered-map,Nested,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 =

守则:

    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;
boost::无序地图;
{
boost::无序映射h;
h、 插入(制作一对(1,0.5));
图.插入(形成一对(5,h));
}
{
boost::无序的_-map h=map[5];
h、 插入(制作成对(2,0.6));
图.插入(形成一对(5,h));
}

cout下面是在第二段代码中发生的情况:

  • h=map[5]
    创建内部映射的副本
  • h.insert(…)
    向内部映射的副本添加一个值
  • map.insert(…)
    不执行任何操作。但是键5已经存在,因此没有插入。您可以通过检查insert调用返回值的布尔部分是否为false来确认这一点
  • 在块的末尾,复制的贴图将被丢弃,原始内部贴图(具有单个值)将保留在
    map
    中。结果,您得到map[5]的输出。size()=1

    但是,如果将内部映射的值类型设置为指针,
    boost::unordered_map*
    ,为什么我们会得到2的输出呢?第二段代码将执行以下操作:

  • h=map[5]
    将获得一个指向插入
    map
    的内部映射的指针
  • h.insert(…)
    直接将值添加到内部映射,而不是添加到副本中。此时,映射[5].size()==2已经存在
  • map.insert(…)
    仍然不执行任何操作。但是没有必要——内部地图已经被修改过了

  • 正是正确的答案。我还发现,使用map[i][j]我们可以轻松地做与指针相同的事情。在我的简单测试中,它们的效率相等。那么([]],insert,emplace)的区别是什么呢。我知道,如果键存在,最后两个将不会做任何事情。还有更多的区别吗?