Warum gibt dies einen Laufzeit-Gleitkommafehler aus?
Frage
Ich mache eine Aufgabe für die Schule, in der Hashmaps eingeführt wurden, und erstelle daher eine Vorlagenklasse für eine Hashmap, die Folgendes verwendet std::hash
Funktion.Das Problem, das ich habe, kommt in meine insert
funktion, die unten gezeigt wird:
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));
}
Mein Fehler tritt in der Zeile auf: int bucket = intKey % this->size();
.
Ich verstehe nicht ganz, warum dies zu einem Gleitkommafehler führen würde, da ich meine Arbeit vollständig in ganzen Zahlen erledige.Mit dem Schlüssel "Banane" und dem Wert 3 ist das gehashte int 2068534322.In dem Fall, in dem this->size
ist 5, sollte das Modulo als 2 bewertet werden.
Also, warum genau bekomme ich einen Gleitkommafehler?
BEARBEITEN 1:Ich habe es auch versucht this->size()
ersetzt durch eine hartcodierte 5 (was ist was this->size
bewerten sollte), so dass die this->size
hat kein Problem damit, mit einer 0 zu bewerten.
Lösung
Sie führen eine Modulo-Operation (== Division) durch, also müssen Sie sicherstellen, dass Ihr Nenner nicht Null ist
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));
}
Oder zumindest einen Platz assert
anweisung, wenn Sie dies tun, um zu verfolgen, woher falsche Anrufe kamen:
std::assert(this->size());
int bucket = intKey % this->size();