我知道问题已发布,但不幸的是我无法将答案与我的问题联系起来,所以我会再问一次......
我正在研究线性哈希项目。我的代码基本上应该创建一个动态增长的哈希表。元素存储在固定大小的桶(数组)中,然后表中有更多桶。每个桶都可以有它的溢出桶(当原始桶中没有更多位置时创建)并且每次创建溢出时,所谓的“拆分”都会完成,并且会向表中添加一个桶并重新散列表。还有更多细节,但我认为这些基础知识足以理解我的代码..
所以我有数据结构元素和bucket,bucket有自己的几种方法,插入元素,找到它,创建溢出等。此外,发生其他一切的类是ADS_set,它是一个预先描述的模板类我必须使用的方法。整个事情都与指针一起工作,我有几个用于测试它的测试文件。
当我现在测试代码时,它会编译,但在某些时候它会返回以下错误消息:捕获的信号:浮点异常,并带有提示:方法:插入(迭代器,迭代器)据我所知:
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,最重要的功能是:
--> findElement(const_reference key) - 第 51-69 行
--> insertElementInTable(const_reference key) - 第 179-197 行调用 createOverflow() 44-49、splitTable() 131-147、rehashAfterSplit() 153-176 和 insertElementInBucket() 72-88
希望您能提供一些新的见解,因为我不知道为什么会出现问题。谢谢!