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