Почему это дает ошибку с плавающей запятой во время выполнения?

StackOverflow https://stackoverflow.com//questions/24002386

  •  20-12-2019
  •  | 
  •  

Вопрос

Я выполняю школьное задание, в котором представлены хэш-карты, и поэтому создаю шаблонный класс для хэш-карты, который использует std::hash функция.Проблема, с которой я столкнулся, заключается в моем insert функция, которая показана ниже:

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

Моя ошибка возникает в строке: int bucket = intKey % this->size();.

Я не совсем понимаю, почему это может привести к ошибке с плавающей запятой, поскольку я выполняю свою работу полностью в целых числах.С ключом «банан» и значением 3 хешированное целое число равно 2068534322.В случае, когда this->size равно 5, то по модулю следует оценивать как 2.

Итак, почему я получаю ошибку с плавающей запятой?

РЕДАКТИРОВАТЬ 1:я тоже попробовал this->size() заменено на жестко закодированную цифру 5 (именно это и есть this->size должно оцениваться как), поэтому this->size у него нет проблем с оценкой 0.

Это было полезно?

Решение

Вы выполняете операцию по модулю (== деления), поэтому вам необходимо убедиться, что ваш знаменатель не равен нулю.

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

Или хотя бы разместить assert оператор при этом, чтобы отслеживать, откуда поступили неправильные вызовы:

std::assert(this->size());
int bucket = intKey % this->size(); 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top