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

时间:2014-04-02 02:28:40

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

我知道如何使用std::unordered_map::emplace,但如何使用emplace_hintcpluspluscppreference都没有提供一组示例来说明我们如何知道元素的放置位置。

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

1 个答案:

答案 0 :(得分:19)

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

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

unordered_map::emplace_hint的另一个好处是与map::emplace_hint更好的API兼容性,因此代码可以切换容器类型并使emplace_hint不会破坏编译,尽管它们最终可能会慢于如果代码已切换为emplace(),因为对map有帮助的关键但不同的关键提示可能对unordered_map无用。