Question

Je suis en train de faire une mission pour l'école qui a introduit hashmaps, et je suis donc la création basé sur un modèle de classe pour une table de hachage qui utilise le std::hash fonction.Le problème que je rencontre vient dans mon insert la fonction, qui est indiqué ci-dessous:

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));
}

Mon erreur se produit à la ligne: int bucket = intKey % this->size();.

Je ne comprends pas très bien pourquoi ce serait lui donner un flottant d'erreur depuis que je suis en train de faire mon travail entièrement en nombres entiers.Avec la touche "banane" et la valeur 3, le haché int est 2068534322.Dans le cas où this->size est 5, le modulo devraient être évalués comme des 2.

Donc, exactement pourquoi suis-je arriver à virgule flottante d'erreur?

EDIT 1:J'ai aussi essayé this->size() remplacé par un codées en dur 5 (qui est ce que this->size devrait évaluer), de sorte que le this->size n'est-ce pas un problème de l'évaluation par un 0.

Était-ce utile?

La solution

Vous faire un modulo ( = = ) de la division de l'opération, si vous avez besoin d'assurer votre dénominateur n'est pas zéro

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 au moins une place assert déclaration lors de cette opération à suivre la trace de faux appels provenaient de:

std::assert(this->size());
int bucket = intKey % this->size(); 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top