Perché questo dà un errore a punto flottante runtime?
Domanda
Sto facendo un incarico per la scuola che ha introdotto Hashmaps, e quindi sto creando una classe templata per un hashmap che utilizza la funzione std::hash
.Il problema che sto avendo arrivato nella mia funzione insert
, che è mostrato di seguito:
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));
}
.
Il mio errore si verifica sulla linea: int bucket = intKey % this->size();
.
Non capisco il motivo per cui questo darebbe un errore a punto flottante poiché sto facendo il mio lavoro interamente in numeri interi.Con la chiave "Banana" e il valore 3, l'hashed int è 2068534322. Nel caso in cui this->size
è 5, il modulo deve essere valutato come 2.
Quindi, perché esattamente sto ottenendo un errore punto flottante?
Modifica 1: Ho anche provato this->size()
sostituito con un hard-codificato 5 (che è ciò che il this->size
deve valutare), quindi il this->size
non ha un problema di valutare con uno 0.
Soluzione
Fai un'operazione Modulo (== Division), quindi è necessario assicurare il tuo denominatore non è 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));
}
.
o almeno posizionare un'istruzione assert
quando si esegue questo per tracciare le chiamate sbagliate da:
std::assert(this->size());
int bucket = intKey % this->size();
.