问题 你什么时候使用std :: unordered_map :: emplace_hint?


我知道怎么用 std::unordered_map::emplace,但我该如何使用 emplace_hint?也不 CPLUSPLUS 也不 cppreference 提供一组示例,说明我们如何知道元素的放置位置。

任何人都可以提供一些有关这方面的信息,或者提供一些示例/插图,告诉我们什么时候可以知道布置元素应该去哪里?


8187
2018-04-02 02:28


起源



答案:


什么可以 unordered_map 可能会提示吗?好吧,如果迭代器使用与元素相同的键来寻址一个元素 emplace_hint 已经被要求插入,然后它可以快速失败 - 只是一个关键的比较,没有任何散列或摸索通过该桶的任何散列碰撞元素列表。但是如果密钥不匹配,那么提示是无用的,因为任何其他密钥 - 无论如何“接近”值 - 应该(概率地)在一个完全不相关的桶(给定通常被认为是“好”的哈希函数) ),所以时间浪费在一个关键的比较上只是为了重新开始,好像它是正常的 emplace

当你插入预先排序的元素时,这可能很有用,旨在删除过程中的大量重复项,但是关键是如此之大,以至于将迭代器保存到刚插入的元素比复制更容易。密钥,或者散列函数可能特别慢。

另一个好处 unordered_map::emplace_hint 是更好的API兼容性 map::emplace_hint,所以代码可以切换容器类型并拥有 emplace_hint不会破坏编译,尽管它们可能比代码切换到的速度慢 emplace() 作为关键但不同的关键提示,有助于a map 可能没什么用的 unordered_map


14
2018-04-02 02:47



我没有完全得到这个答案..也许是因为它的措辞如何。除非我预先订购了多个钥匙,否则它没用了? - Dean
@Dean:你不一定要有“预先订购的多个密钥” - 可能是它们自然发生的顺序意味着重复的密钥有足够高的概率连续发生以保持迭代器到最后安置的价值,因为你可以快速拒绝重复。尽管如此,这完全基于我能想到的唯一可能的使用提示 - 如果您的实现实际上没有使用提示,那么您将浪费时间和精力来提供它。 - Tony Delroy


答案:


什么可以 unordered_map 可能会提示吗?好吧,如果迭代器使用与元素相同的键来寻址一个元素 emplace_hint 已经被要求插入,然后它可以快速失败 - 只是一个关键的比较,没有任何散列或摸索通过该桶的任何散列碰撞元素列表。但是如果密钥不匹配,那么提示是无用的,因为任何其他密钥 - 无论如何“接近”值 - 应该(概率地)在一个完全不相关的桶(给定通常被认为是“好”的哈希函数) ),所以时间浪费在一个关键的比较上只是为了重新开始,好像它是正常的 emplace

当你插入预先排序的元素时,这可能很有用,旨在删除过程中的大量重复项,但是关键是如此之大,以至于将迭代器保存到刚插入的元素比复制更容易。密钥,或者散列函数可能特别慢。

另一个好处 unordered_map::emplace_hint 是更好的API兼容性 map::emplace_hint,所以代码可以切换容器类型并拥有 emplace_hint不会破坏编译,尽管它们可能比代码切换到的速度慢 emplace() 作为关键但不同的关键提示,有助于a map 可能没什么用的 unordered_map


14
2018-04-02 02:47



我没有完全得到这个答案..也许是因为它的措辞如何。除非我预先订购了多个钥匙,否则它没用了? - Dean
@Dean:你不一定要有“预先订购的多个密钥” - 可能是它们自然发生的顺序意味着重复的密钥有足够高的概率连续发生以保持迭代器到最后安置的价值,因为你可以快速拒绝重复。尽管如此,这完全基于我能想到的唯一可能的使用提示 - 如果您的实现实际上没有使用提示,那么您将浪费时间和精力来提供它。 - Tony Delroy