【发布时间】:2018-11-27 18:48:45
【问题描述】:
我知道问题已经发布,但很遗憾我无法将答案与我的问题联系起来,所以我会再问一次......
我正在从事线性哈希项目。我的代码基本上应该创建一个动态增长的哈希表。元素存储在固定大小的桶(数组)中,然后表中有更多桶。每个桶都可以有它的溢出桶(当原始桶中没有更多位置时创建)并且每次创建溢出时,所谓的“拆分”都会完成,并且会向表中添加一个桶并重新散列表。还有更多细节,但我认为这些基础知识足以理解我的代码..
所以我有数据结构元素和桶,桶有自己的几个方法,插入元素,找到它,创建溢出等。进一步在类中发生的一切是 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
希望您能提供一些新的见解,因为我不知道为什么会出现问题。谢谢!
【问题讨论】:
-
您是否调试过代码以获得更多洞察?
标签: c++ exception floating-point hashtable floating-point-exceptions