Pergunta

Eu estou fazendo uma atribuição para a escola que introduziu hashmaps, e por isso estou criando um modelo de classe para um hashmap que usa o std::hash função.O problema que eu estou tendo vem na minha insert a função, que é mostrado abaixo:

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

Meu erro ocorre na linha: int bucket = intKey % this->size();.

Eu não entendo muito bem por que isto daria um erro de ponto flutuante desde que eu estou fazendo o meu trabalho inteiramente em números inteiros.Com a chave de "banana" e o valor 3, o hash int é 2068534322.No caso de this->size é 5, o módulo deve ser avaliada como 2.

Então, por que exatamente eu estou recebendo um erro de ponto flutuante?

EDIT 1:Eu também tentei this->size() substituído com um hard-coded 5 (que é o que this->size deve avaliar), para a this->size não é ter um problema de avaliar com um 0.

Foi útil?

Solução

Você faz um módulo (===divisão) da operação, de modo que você precisa para garantir o seu denominador não é 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));
}

Ou pelo menos colocar um assert instrução ao fazer isso para pista onde errado chamadas veio:

std::assert(this->size());
int bucket = intKey % this->size(); 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top