【问题标题】:c++ linear hashing floating point exception (core dumped)c++ 线性散列浮点异常(核心转储)
【发布时间】: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


【解决方案1】:

在 C++ 中,^ 是按位异或运算符,而不是幂运算符。你正被零除。

【讨论】:

  • 谢谢!!我非常专注于其他事情,以至于我完全监督了那个......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多