【问题标题】:hash table copy can't find word using find function哈希表副本使用查找功能找不到单词
【发布时间】:2017-04-01 17:32:08
【问题描述】:

我正在构建一个使用线性探测作为其冲突解决方法的哈希表,但我被困在最后一次检查中。复制到表中找不到应该存在的键,因为它在检查之前已从原始哈希表中删除。

template <class TYPE>
LPTable<TYPE>::LPTable(const LPTable<TYPE>& other){


    max_ = other.max_;
    LargerMax = other.LargerMax;
    size_ = other.size_;

    if (other.size_)
    {
            records_ = new Record*[other.LargerMax];


            for (int i = 0; i < other.size_; i++) // chasnged size from larger max
            {

                    if (other.records_[i] != nullptr)
                    {
                            records_[i] = new Record();    //throws exception after this loop

                            records_[i]->key_ = other.records_[i]->key_;
                            records_[i]->data_ = other.records_[i]->data_;
                            records_[i]->isDeleted = other.records_[i]->isDeleted;


                    }
            }
    }
    else
            size_ = 0;

}

【问题讨论】:

  • 你试过调试你的代码吗?
  • @Fureeish。是的,这就是我不明白的原因。它进入 find 函数中的 for 循环,但从未在复制的表中找到键
  • 什么究竟不能按预期工作?比较?
  • 我不确定为什么在从哈希表中删除项目后,哈希表副本找不到它正在寻找的单词
  • @Fureeish 在从第一个表中删除记录后试图在复制的哈希表中找到一个键

标签: c++ hashmap logic hashtable


【解决方案1】:

LPTable 类的records_ 字段不必是指向指针的指针;一个指针就足够了,这很可能是您问题的根源。此外,您应该很可能更喜欢这个任务的向量。

您看到的奇怪行为是由于LPTable 的复制构造函数中的错误。您正在分配一个指针数组,然后遍历 other 并复制指针。

换句话说,您没有复制指针所指的Record 实例。

“复制自”和“复制到”LPTable 的records_ 数组中的相应指针指向Record 类的同一实例。因此,当您修改“复制自”哈希表中的条目时,这些更改会反映在“复制到”哈希表中

【讨论】:

  • @apmccartney。抱歉,我试图最小化显示的代码。我在上面尝试的操作会使程序崩溃,这不是你如何深度复制复制 ctor 中的变量吗?我被困在如何正确地做到这一点
  • @apmccartney。伪代码中的复制ctor。对不起。
  • 注释不是示例代码的合适位置,但我会尝试解决问题。您已将records_ 成员变量声明为指向Records 指针的指针。在复制构造函数中,调用record_ 成员变量(例如records_[i])的偏移量取消引用不是记录。因为records_Record** 类型,所以这个操作的返回值是一个指针。该指针没有分配了内存。在延迟和分配指针所指的值之前,必须先为其分配内存。
  • 也就是说,在解引用和访问条目的key成员变量之前,可以调用records_[i] = new Record()
  • 综上所述,这将是一个性能很差的哈希表实现。将records_ 设为std::vector&lt;Record&gt;(甚至记录*)并连续存储元素会更好地为您服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 2018-10-23
相关资源
最近更新 更多