سؤال

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