Por que isso dá um runtime erro de ponto flutuante?
Pergunta
Eu estou fazendo uma atribuição para a escola que introduziu hashmaps, e por isso estou criando um modelo de classe para um hashmap que usa o std::hash
função.O problema que eu estou tendo vem na minha insert
a função, que é mostrado abaixo:
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));
}
Meu erro ocorre na linha: int bucket = intKey % this->size();
.
Eu não entendo muito bem por que isto daria um erro de ponto flutuante desde que eu estou fazendo o meu trabalho inteiramente em números inteiros.Com a chave de "banana" e o valor 3, o hash int é 2068534322.No caso de this->size
é 5, o módulo deve ser avaliada como 2.
Então, por que exatamente eu estou recebendo um erro de ponto flutuante?
EDIT 1:Eu também tentei this->size()
substituído com um hard-coded 5 (que é o que this->size
deve avaliar), para a this->size
não é ter um problema de avaliar com um 0.
Solução
Você faz um módulo (===divisão) da operação, de modo que você precisa para garantir o seu denominador não é zero
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));
}
Ou pelo menos colocar um assert
instrução ao fazer isso para pista onde errado chamadas veio:
std::assert(this->size());
int bucket = intKey % this->size();