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.

È stato utile?

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(); 
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top