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.

¿Fue útil?

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(); 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top