c ++线性哈希浮点异常(核心转储)

时间:2018-06-18 21:23:57

标签: c++ exception floating-point hashtable floating-point-exceptions

我知道问题已经发布,但遗憾的是我无法将问题的答案与我的问题联系起来,所以我会再问一次......

我正在研究线性哈希项目。我的代码基本上应该创建一个动态增长的哈希表。元素存储在固定大小的存储桶(数组)中,然后表中有更多存储桶。每个桶都可以有溢出桶(当原始桶中没有其他位置时创建)并且每次创建溢出时所谓的“分割”#39;完成后,将另外一个桶添加到表中,并重新处理表。有更多细节,但我认为这些基础知识足以理解我的代码..

所以我有数据结构元素,bucket和bucket有自己的几个方法,插入元素,找到它,创建溢出等等。继续在其他一切发生的类是ADS_set,它是一个模板类我必须使用的预先描述的方法。整个事情与指针一起工作,我有几个测试文件,我用它来测试它。

当我现在测试代码时,它会编译,但在某些时候它会返回以下错误消息:捕获信号:浮点异常,带有提示:方法:insert(iterator,iterator),据我所知:

template<typename InputIt> void insert(InputIt first, InputIt last) {                        
    for (auto it=first; it != last; ++it) {
        size_type idx = hashIndex(*it); 
        if(!(table[idx]->findElement(*it))) {
              insertElementInTable(*it);
        }
     }
}

这部分代码使用散列函数,它使用模数但我看不出这会如何导致浮点异常,因为散列函数是这样的:

size_type hashIndex(const_reference key) const {
    size_type idx = hasher{}(key) % (2^roundNum); //roundNum is initialized with 1
    size_type d{roundNum};

    if(idx < nextToSplit) {
        ++d;
        idx = hasher{}(key) % (2^d);
    }

    return idx;
}

您可以在此处看到的其余代码https://pastebin.com/HXeUpaW5以及最重要的功能是:

- &GT; findElement(const_reference key) - 第51-69行

- &GT; insertElementInTable(const_reference key) - 第179-197行调用createOverflow()44-49,splitTable()131-147,rehashAfterSplit()153-176和insertElementInBucket()72-88

希望您能提供一些新的见解,因为我不知道问题发生的原因。谢谢!

1 个答案:

答案 0 :(得分:2)

在C ++中,--是按位XOR运算符,而不是幂运算符。你除以零。