¿Por qué esto genera un error de punto flotante en tiempo de ejecución?
Pregunta
Estoy haciendo una tarea para la escuela que introdujo hashmaps, por lo que estoy creando una clase con plantilla para un hashmap que usa el std::hash
función.El problema que estoy teniendo viene en mi insert
función, que se muestra a continuación:
template <class K, class V>
void HashMap<K, V>::insert(K key, V value)
{
std::hash<std::string> stringHash;
int intKey = stringHash(key);
int bucket = intKey % this->size();
map[bucket].push_back(std::pair<K, V>(key, value));
}
Mi error ocurre en la línea: int bucket = intKey % this->size();
.
No entiendo muy bien por qué esto daría un error de punto flotante ya que estoy haciendo mi trabajo completamente en números enteros.Con la clave "banana" y el valor 3, el hash int es 2068534322.En el caso donde this->size
es 5, el módulo debe evaluarse como 2.
Entonces, ¿por qué exactamente recibo un error de punto flotante?
EDITAR 1:yo también lo intenté this->size()
reemplazado con un 5 codificado (que es lo que this->size
debe evaluar), por lo que el this->size
no tiene problemas para evaluar con un 0.
Solución
Haces una operación de módulo (== división), por lo que debes asegurarte de que tu denominador no sea cero
template <class K, class V>
void HashMap<K, V>::insert(K key, V value)
{
std::hash<std::string> stringHash;
int intKey = stringHash(key);
int bucket = this->size() ? intKey % this->size() : intKey;
// or whatever makes sense to assign for the latter condition
map[bucket].push_back(std::pair<K, V>(key, value));
}
O al menos colocar un assert
declaración al hacer esto para rastrear de dónde provienen las llamadas incorrectas:
std::assert(this->size());
int bucket = intKey % this->size();