如果我要在std::unordered_map
中插入新元素(不存在键),可以使用emplace_hint
提高性能吗?
提示应该具有什么价值?
通常,我知道键值(整数类型)大于映射中的所有键。那我应该使用cend
作为提示吗?
答案 0 :(得分:3)
emplace_hint
。与std::map
具有确定的顺序并使用end
作为提示会给您带来恒定的放置不同,无序版本已经具有恒定的放置。
如果我们看看Table 70 — Unordered associative container requirements (in addition to container),我们有
期望:
value_type
是Cpp17EmplaceConstructible从X
到args
的。效果:等同于
a.emplace( std::forward<Args>(args)...)
。返回值是一个迭代器,该迭代器使用与新插入的元素等效的键指向该元素。const_iterator
p
是一个提示,指向搜索应从何处开始。允许实现忽略提示。
您会发现您甚至不能保证提供提示会做任何事情。
行
const_iterator
p
是一个提示,指出搜索应从何处开始
让我相信迭代器必须位于要放置元素的存储桶的开头,因此end
/ cend
并不是您要使用的对象。
答案 1 :(得分:2)
我已经进行了一些测试,从我看到的结果来看,std::unordered_map
完全忽略了该提示。我找不到传递给它的任何价值,似乎根本没有提供任何优势。
该标准显式地提供了无序集合的实现,以忽略传递给emplace_hint
的提示,我认为大多数(如果不是全部)通常都可以做到。该规范并没有真正说明您应该将迭代器传递给要插入的值(如果有)还是传递给迭代器(如对有序关联集合那样)。鉴于它是基于哈希的,因此 near 正确迭代点的迭代器可能没有用。因此,为了使其有希望做任何事情,它可能需要是实际插入点的迭代器(例如,如果您尝试插入重复项,则其具有与插入相同的键)。
我怀疑您是否可以传递任何具有显着优势的价值(并且在测试中,我还没有找到一个可以做到的优势)。