嵌套的 boost::unordered_map 不更新值?

发布于 2024-12-04 12:12:17 字数 478 浏览 0 评论 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* > 时相反,那么一切都会顺利进行。 谁能帮助我吗?

The Code:

    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;

Why the output is 1 not 2?
And when i use boost::unordered_map* > instead, then everything works well.
Can anyone help me?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

︶ ̄淡然 2024-12-11 12:12:17

以下是第二个代码块中发生的情况:

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

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

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

  1. h = map[5] 将获取指向插入到 map 中的内部映射的指针。
  2. h.insert(...) 直接将值添加到内部映射中——而不是添加到副本中。此时,已经有了map[5].size()==2
  3. map.insert(...) 仍然什么也不做。但没有必要——内部地图已经就地修改了。

Here's what happens in the second block of code:

  1. h = map[5] creates a copy of the inner map.
  2. h.insert(...) adds a value to the copy of the inner map.
  3. map.insert(...) does nothing. unordered_map::insert inserts an element to the map if and only if there is no element in the map with an equivalent key. But the key 5 is already present, and so no insertion happens. You can confirm this by checking that the boolean portion of the return value from the insert call is false.

At the end of the block, the copied map is discarded, and the original inner map, with a single value, remains in map. As a result, you get the output of map[5].size()==1.

But why do we get an output of 2 if the value type of the inner map is set to a pointer, boost::unordered_map<int, float>*? The second block of code would do this:

  1. h = map[5] will get a pointer to the inner map inserted into map.
  2. h.insert(...) adds a value to the inner map directly -- not into a copy. At this point, map[5].size()==2 already.
  3. map.insert(...) still does nothing. But there's no need to -- the inner map was already modified in place.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文