在unordered_map / unordered_set中插入/嵌入新元素时的提示

时间:2019-05-10 19:58:21

标签: c++ c++11 unordered-map unordered-set

如果我要在std::unordered_map中插入新元素(不存在键),可以使用emplace_hint提高性能吗? 提示应该具有什么价值?

通常,我知道键值(整数类型)大于映射中的所有键。那我应该使用cend作为提示吗?

2 个答案:

答案 0 :(得分:3)

使用无序容器时,实际上并不需要

emplace_hint。与std::map具有确定的顺序并使用end作为提示会给您带来恒定的放置不同,无序版本已经具有恒定的放置。

如果我们看看Table 70 — Unordered associative container requirements (in addition to container),我们有

  

期望: value_­type是Cpp17EmplaceConstructible从Xargs的。

     

效果:等同于a.emplace( std::forward<​Args>(​args)...)。返回值是一个迭代器,该迭代器使用与新插入的元素等效的键指向该元素。 const_­iterator p是一个提示,指向搜索应从何处开始。允许实现忽略提示。

您会发现您甚至不能保证提供提示会做任何事情。

  

const_­iterator p是一个提示,指出搜索应从何处开始

让我相信迭代器必须位于要放置元素的存储桶的开头,因此end / cend并不是您要使用的对象。

答案 1 :(得分:2)

我已经进行了一些测试,从我看到的结果来看,std::unordered_map完全忽略了该提示。我找不到传递给它的任何价值,似乎根本没有提供任何优势。

该标准显式地提供了无序集合的实现,以忽略传递给emplace_hint的提示,我认为大多数(如果不是全部)通常都可以做到。该规范并没有真正说明您应该将迭代器传递给要插入的值(如果有)还是传递给迭代器(如对有序关联集合那样)。鉴于它是基于哈希的,因此 near 正确迭代点的迭代器可能没有用。因此,为了使其有希望做任何事情,它可能需要是实际插入点的迭代器(例如,如果您尝试插入重复项,则其具有与插入相同的键)。

摘要

我怀疑您是否可以传递任何具有显着优势的价值(并且在测试中,我还没有找到一个可以做到的优势)。