我知道怎么用 std::unordered_map::emplace
,但我该如何使用 emplace_hint
?也不 CPLUSPLUS 也不 cppreference 提供一组示例,说明我们如何知道元素的放置位置。
任何人都可以提供一些有关这方面的信息,或者提供一些示例/插图,告诉我们什么时候可以知道布置元素应该去哪里?
我知道怎么用 std::unordered_map::emplace
,但我该如何使用 emplace_hint
?也不 CPLUSPLUS 也不 cppreference 提供一组示例,说明我们如何知道元素的放置位置。
任何人都可以提供一些有关这方面的信息,或者提供一些示例/插图,告诉我们什么时候可以知道布置元素应该去哪里?
什么可以 unordered_map
可能会提示吗?好吧,如果迭代器使用与元素相同的键来寻址一个元素 emplace_hint
已经被要求插入,然后它可以快速失败 - 只是一个关键的比较,没有任何散列或摸索通过该桶的任何散列碰撞元素列表。但是如果密钥不匹配,那么提示是无用的,因为任何其他密钥 - 无论如何“接近”值 - 应该(概率地)在一个完全不相关的桶(给定通常被认为是“好”的哈希函数) ),所以时间浪费在一个关键的比较上只是为了重新开始,好像它是正常的 emplace
。
当你插入预先排序的元素时,这可能很有用,旨在删除过程中的大量重复项,但是关键是如此之大,以至于将迭代器保存到刚插入的元素比复制更容易。密钥,或者散列函数可能特别慢。
另一个好处 unordered_map::emplace_hint
是更好的API兼容性 map::emplace_hint
,所以代码可以切换容器类型并拥有 emplace_hint
不会破坏编译,尽管它们可能比代码切换到的速度慢 emplace()
作为关键但不同的关键提示,有助于a map
可能没什么用的 unordered_map
。
什么可以 unordered_map
可能会提示吗?好吧,如果迭代器使用与元素相同的键来寻址一个元素 emplace_hint
已经被要求插入,然后它可以快速失败 - 只是一个关键的比较,没有任何散列或摸索通过该桶的任何散列碰撞元素列表。但是如果密钥不匹配,那么提示是无用的,因为任何其他密钥 - 无论如何“接近”值 - 应该(概率地)在一个完全不相关的桶(给定通常被认为是“好”的哈希函数) ),所以时间浪费在一个关键的比较上只是为了重新开始,好像它是正常的 emplace
。
当你插入预先排序的元素时,这可能很有用,旨在删除过程中的大量重复项,但是关键是如此之大,以至于将迭代器保存到刚插入的元素比复制更容易。密钥,或者散列函数可能特别慢。
另一个好处 unordered_map::emplace_hint
是更好的API兼容性 map::emplace_hint
,所以代码可以切换容器类型并拥有 emplace_hint
不会破坏编译,尽管它们可能比代码切换到的速度慢 emplace()
作为关键但不同的关键提示,有助于a map
可能没什么用的 unordered_map
。