c++ - 重新哈希表

标签 c++ hash hashtable

我正在尝试通过删除旧表并创建具有相同内容的新的更大表来重新哈希表。我创建了一个reHash函数,但是这个函数会出现内存泄漏,导致函数执行时程序崩溃。我找不到我的错误。

void HashMap::reHash()
{
int OldCapacity = cap;
cap = cap * 2 + 1; //set new capacity
Node** newHashTable = new Node*[cap]; //create a temporary table to hold info
for (int i = 0; i < cap; i++)
{
    newHashTable[i] = nullptr;
}

const Node* n;
//fill in the new temp table with old info
for (int i = 0; i < OldCapacity; ++i)
{
    n = HashTable[i];
    while (n != nullptr)
    {
        //initialize new node
        Node* nod = new Node;
        nod->key = n->key;
        nod->value = n->value;
        nod->next = nullptr;
        Node*& bucket = newHashTable[default_hash_function(n->key)/cap];
        nod->next = bucket;
        bucket = nod;
        n = n->next;
    }
}

// delete the links 
for (int i = 0; i < OldCapacity; ++i)
{
    Node *curr = HashTable[i];
    Node *next;
    while (curr != nullptr)
    {
        next = curr->next;
        delete curr;
        curr = next;
    }
}
HashTable = newHashTable;
}

最佳答案

你的根本泄漏是这样的:

HashTable = newHashTable;

您从未删除过旧的指针数组。应该是这样的:

delete [] HashTable;
HashTable = newHashTable;

您也没有在重新分配中针对表大小正确计算哈希函数的模,这将对您的哈希表造成毁灭性的影响。

这个:

Node*& bucket = newHashTable[default_hash_function(tmp->key) / cap];

应该是这样的:

Node*& bucket = newHashTable[default_hash_function(tmp->key) % cap];
// note modulo operator -------------------------------------^

Rehash Sans-分配

老实说,除了分配新床之外,不需要任何动态分配。您可以通过将现有节点从旧床移动到新床来使用它们。

void HashMap::reHash()
{
    int OldCapacity = cap;
    cap = cap * 2 + 1;

    // allocate new bed. note: uses () to value-initialize nullptr entries
    Node** newHashTable = new Node*[cap]();

    //fill in the new temp table with old info
    for (int i = 0; i < OldCapacity; ++i)
    {
        Node *n = HashTable[i];
        while (n != nullptr)
        {
            // advance n *before* moving node to new hash bed
            Node *tmp = n;
            n = n->next;

            // find the proper collision list pointer.
            Node*& bucket = newHashTable[default_hash_function(tmp->key) % cap];
            tmp->next = bucket;
            bucket = tmp;
        }
    }

    delete [] HashTable;
    HashTable = newHashTable;
}

关于c++ - 重新哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037963/

相关文章:

c++ - 将 c++ int 转换为 VARBINARY 并再次返回

c++ - 为什么 std::optional<boost::variant<A, bool>> 没有从 `std::optional<A>` 成功构造?

c++ - 如何从 C++ 管理 ghci?

c++ - 检查 16 个容器中是否存在值

c# - 是否有符合 .NET FIPS 的键控 SHA256 哈希算法?

java - 我定义了一个 equals 方法,但 Hashtable 忽略了它。为什么?

c++ - 无法访问私有(private)成员 - 原子

ruby - 按值对 Hash of Hashes 进行排序(并返回哈希,而不是数组)

lisp - 写入/读取 Common Lisp (SBCL) 哈希表,或替代方案

c++ - 带链接列表的哈希表中的前 10 个频率