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