Почему это дает ошибку с плавающей запятой во время выполнения?
Вопрос
Я выполняю школьное задание, в котором представлены хэш-карты, и поэтому создаю шаблонный класс для хэш-карты, который использует 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();