如果我只想指定哈希函数,我应该传递给unordered_map的存储桶计数参数什么?

What should I pass to unordered_map's bucket count argument if I just want to specify a hash function?

本文关键字:存储 map 什么 参数 unordered 只想 哈希 函数 我应该 如果      更新时间:2023-10-16

c++ 11的unordered_map的默认构造函数是这样的:

explicit unordered_map( size_type bucket_count = /*implementation-defined*/,
                    const hasher& hash = hasher(),
                    const key_equal& equal = key_equal(),
                    const allocator_type& alloc = allocator_type() );

我想用自定义散列函数创建一个unordered_map,但它是构造函数的第二个参数。

我应该使用多少桶数?是否有一个神奇的值,我可以用它来告诉容器自己决定?否则,是否存在一种启发式方法,我可以根据我期望映射包含的键的数量来猜测一个好的桶号?我应该在意吗?

我不会太担心的。

容器保证桶计数至少您提供的值,也就是说,如果需要,它将增加它。你可以传递0作为桶计数,实现将会做像std::max(count, 10)这样的事情并覆盖零值,或者它只会在第一次插入时重新散列。

另一种选择是从默认构造的对象中复制值:

H hasher;
unordered_map<K,T,H,P> m{ unordered_map<K,T,H,P>{}.bucket_count(), hasher };

这将把桶计数设置为实现的默认值(但确实要求H哈希函数类型为DefaultConstructible)。

FWIW GCC的unordered_map将10作为您所展示的构造函数的默认值(因此这可能也是合理的默认值),并将0用于接受一对迭代器或initializer_list的构造函数。

unordered_map的模板参数之一是散列函数。如果你在那里指定了你的哈希函数对象,你可以让构造函数参数保持默认设置。