c++ - tach - ¿Qué debo pasar al argumento de recuento de depósitos de unordered_map si solo quiero especificar una función hash?
hast tach (2)
No me preocuparía demasiado por eso.
El contenedor garantiza que el conteo de cubetas será al menos el valor que proporcione, es decir, aumentará si es necesario. Podría pasar el cero como el conteo de depósitos y la implementación hará algo como std::max(count, 10)
y anulará el valor cero, o simplemente volverá a parpadear en la primera inserción.
Otra alternativa sería copiar el valor de un objeto construido por defecto:
H hasher;
unordered_map<K,T,H,P> m{ unordered_map<K,T,H,P>{}.bucket_count(), hasher };
Esto establecerá el recuento de depósitos en el valor predeterminado de la implementación (pero requiere que el tipo de función H
hash sea DefaultConstructible).
El mapa unordered_map
FWIW GCC usa 10 como valor predeterminado para el constructor que mostró (por lo que probablemente sea un valor predeterminado razonable también) y usa 0 para los constructores que toman un par de iteradores o una lista de initializer_list
.
El constructor predeterminado del unordered_map
C ++ 11 se ve así:
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() );
Quiero crear un mapa_ordenado con una función hasher personalizada, pero es el segundo argumento para el constructor.
¿Qué cantidad de cubos debo usar? ¿Hay un valor mágico que pueda usar para decirle al contenedor que decida por sí mismo? De lo contrario, ¿hay alguna heurística que pueda usar para estimar un buen número de cubeta en función de la cantidad de claves que espero que contenga mi mapa? ¿Debería siquiera importarme?
Uno de los parámetros de la plantilla para unordered_map es la función hash. Si especifica su objeto de función hash allí, puede dejar los parámetros del constructor en su configuración predeterminada.