Что я должен передать аргументу 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
с пользовательской хешерной функцией, но это второй аргумент конструктору.
Какой подсчет ведра я должен использовать? Есть ли волшебное значение, которое я могу использовать, чтобы сообщить контейнеру о себе? В противном случае, существует ли эвристика, которую я могу использовать для оценки хорошего числа ведра на основе чего-то вроде количества ключей, которые я ожидаю, чтобы моя карта содержала? Должен ли я даже заботиться?
Ответы
Ответ 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 является хэш-функция. Если вы укажете свой объект функции хеширования, вы можете оставить параметры конструктора по умолчанию.