我知道问题已经发布,但遗憾的是我无法将问题的答案与我的问题联系起来,所以我会再问一次......
我正在研究线性哈希项目。我的代码基本上应该创建一个动态增长的哈希表。元素存储在固定大小的存储桶(数组)中,然后表中有更多存储桶。每个桶都可以有溢出桶(当原始桶中没有其他位置时创建)并且每次创建溢出时所谓的“分割”#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
希望您能提供一些新的见解,因为我不知道问题发生的原因。谢谢!
答案 0 :(得分:2)
在C ++中,--
是按位XOR运算符,而不是幂运算符。你除以零。