如果我只想指定一个哈希函数,我应该传递给unordered_map的bucket count参数?

zne*_*eak 23 c++ stl unordered-map c++11

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() );
Run Code Online (Sandbox Code Playgroud)

我想unordered_map用自定义哈希函数创建一个,但它是构造函数的第二个参数.

我应该使用什么桶数?是否有一个神奇的价值我可以用来告诉容器自己决定?否则,是否有一种启发式方法可以根据我期望我的地图包含的键数来猜测一个好的桶号?我应该关心吗?

Jon*_*ely 17

我不会太担心它.

容器保证桶数至少是您提供的值,即如果需要它将增加它.你可以传递零作为桶计数,并且实现将执行类似的操作std::max(count, 10)并覆盖零值,或者它将在第一次插入时重新进行.

另一种方法是从默认构造的对象复制值:

H hasher;
unordered_map<K,T,H,P> m{ unordered_map<K,T,H,P>{}.bucket_count(), hasher };
Run Code Online (Sandbox Code Playgroud)

这会将桶数设置为实现的默认值(但确实需要H哈希函数类型为DefaultConstructible.)

FWIW GCC unordered_map使用10作为你展示的构造函数的默认值(所以这也许是一个合理的默认值)并且使用0作为构造函数的一对迭代器或者initializer_list.

  • 你确定`std :: min`吗?如果你想要至少10个元素,那么公式是`std :: max(count,10)`. (2认同)