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カスタムハッシャー関数を使用してを作成したいのですが、これはコンストラクターの2番目の引数です。

どのバケット数を使用する必要がありますか?コンテナに自分で決定するように指示するために使用できる魔法の値はありますか?それ以外の場合、マップに含まれると予想されるキーの数などに基づいて、適切なバケット数を推測するために使用できるヒューリスティックはありますか?私も気にする必要がありますか?

4

2 に答える 2

19

私はそれについてあまり心配しません。

コンテナーは、バケット数が少なくとも指定した値であることを保証します。つまり、必要に応じて増やします。バケット カウントとして 0 を渡すと、実装は次のようなことstd::max(count, 10)を行って 0 の値をオーバーライドするか、最初の挿入で再ハッシュします。

もう 1 つの方法は、デフォルトで構築されたオブジェクトから値をコピーすることです。

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

これにより、バケット数が実装のデフォルトに設定されます (ただし、Hハッシュ関数の型が DefaultConstructible である必要があります)。

FWIW GCCunordered_mapは、表示されたコンストラクターのデフォルトとして 10 を使用し (したがって、おそらくこれも妥当なデフォルトです)、イテレーターのペアまたはinitializer_list.

于 2013-01-06T13:33:12.257 に答える
2

unordered_map のテンプレート パラメーターの 1 つはハッシュ関数です。そこでハッシュ関数オブジェクトを指定すると、コンストラクターのパラメーターをデフォルト設定のままにしておくことができます。

于 2013-01-06T05:10:49.943 に答える