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.

War es hilfreich?

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(); 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top