嵌套的 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* > 时相反,那么一切都会顺利进行。 谁能帮助我吗?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
以下是第二个代码块中发生的情况:
h = map[5]
创建内部映射的副本。h.insert(...)
向内部映射的副本添加一个值。map.insert(...)
不执行任何操作。 unordered_map::insert 将一个元素插入到当且仅当映射中不存在具有等效键的元素时才进行映射。但密钥 5 已经存在,因此不会发生插入。您可以通过检查 insert 调用返回值的布尔部分是否为 false 来确认这一点。在块的末尾,复制的映射被丢弃,并且具有单个值的原始内部映射保留在
map
中。结果,您将得到 map[5].size()==1 的输出。但是,如果内部映射的值类型设置为指针
boost::unordered_map*
,为什么我们会得到 2 的输出呢?第二个代码块将执行此操作:h = map[5]
将获取指向插入到map
中的内部映射的指针。h.insert(...)
直接将值添加到内部映射中——而不是添加到副本中。此时,已经有了map[5].size()==2。map.insert(...)
仍然什么也不做。但没有必要——内部地图已经就地修改了。Here's what happens in the second block of code:
h = map[5]
creates a copy of the inner map.h.insert(...)
adds a value to the copy of the inner map.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:h = map[5]
will get a pointer to the inner map inserted intomap
.h.insert(...)
adds a value to the inner map directly -- not into a copy. At this point, map[5].size()==2 already.map.insert(...)
still does nothing. But there's no need to -- the inner map was already modified in place.