25

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使用自定义哈希函数创建一个,但它是构造函数的第二个参数。

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

4

2 回答 2

19

我不会太担心它。

容器保证桶数至少是您提供的值,即如果需要它会增加它。您可以将零作为存储桶计数传递,并且实现将执行类似的操作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 GCCunordered_map使用 10 作为您展示的构造函数的默认值(因此这可能也是一个合理的默认值),并使用 0 作为构造函数采用一对迭代器或initializer_list.

于 2013-01-06T13:33:12.257 回答
2

unordered_map 的模板参数之一是散列函数。如果您在那里指定哈希函数对象,则可以将构造函数参数保留为默认设置。

于 2013-01-06T05:10:49.943 回答