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

Я делаю задание для школы, которая ввела хеш-карты, и поэтому я создаю шаблонный класс для хеш-карты, которая использует 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, хэшированный int равен 2068534322. В случае, когда this->size равно 5, по модулю следует оценить как 2.

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

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

2

Решение

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

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

Другие решения


По вопросам рекламы [email protected]