Подтвердить что ты не робот

Что я должен передать аргументу count bucket unordered_map, если я просто хочу указать хеш-функцию?

С++ 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 с пользовательской хешерной функцией, но это второй аргумент конструктору.

Какой подсчет ведра я должен использовать? Есть ли волшебное значение, которое я могу использовать, чтобы сообщить контейнеру о себе? В противном случае, существует ли эвристика, которую я могу использовать для оценки хорошего числа ведра на основе чего-то вроде количества ключей, которые я ожидаю, чтобы моя карта содержала? Должен ли я даже заботиться?

4b9b3361

Ответ 1

Я бы не стал слишком беспокоиться об этом.

Контейнер гарантирует, что количество ведра будет, по крайней мере, значением, которое вы предоставляете, т.е. оно будет увеличивать его, если это необходимо. Вы можете пройти нуль в качестве подсчета ведра, и реализация либо сделает что-то вроде 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.

Ответ 2

Одним из параметров шаблона для unordered_map является хэш-функция. Если вы укажете свой объект функции хеширования, вы можете оставить параметры конструктора по умолчанию.