لماذا يعطي هذا خطأ نقطة عائمة وقت التشغيل?
سؤال
أنا أفعل مهمة للمدرسة التي أدخلت هاشمابس ، وهكذا أنا خلق فئة قالب ل هاشماب الذي يستخدم 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();