0

编码:

    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* > 时,一切正常。谁能帮我?

4

1 回答 1

0

这是第二个代码块中发生的事情:

  1. h = map[5]创建内部地图的副本
  2. h.insert(...)向内部映射的副本添加一个值。
  3. map.insert(...)什么也没做。 unordered_map::insert 当且仅当映射中没有具有等效键的元素时才向映射中插入一个元素。但是密钥 5 已经存在,因此不会发生插入。您可以通过检查插入调用的返回值的布尔部分是否为false来确认这一点。

在块的末尾,复制的映射被丢弃,原始的内部映射,具有单个值,保留在map. 结果,您得到了map[5].size()==1的输出。

但是,如果内部映射的值类型设置为指针,为什么我们会得到 2 的输出boost::unordered_map<int, float>*呢?第二个代码块会这样做:

  1. h = map[5]将获得一个指向插入到的内部映射的指针map
  2. h.insert(...)直接将值添加到内部映射 - 而不是副本。此时,map[5].size()==2已经存在。
  3. map.insert(...)仍然什么都不做。但是没有必要——内部地图已经就地修改了。
于 2011-09-14T06:06:23.023 回答