【发布时间】:2020-11-28 17:03:32
【问题描述】:
我在调整哈希表大小时遇到问题。每当我将大小设置为更大的数字时,程序就会崩溃。但是,当我将该值设置为较小时,它不会崩溃。我认为散列函数(计算新值)可能是一个问题,但我无法准确说出原因。好吧,我认为这与索引有关。 将“旧”哈希表中的元素插入到新哈希表中工作正常,但我无法调整它的大小。 这里是resize方法的代码:
void resize()
{
if (current_size >= load * size)
{
int newsize = size * cap;
Node** tmp = new Node * [newsize];
for (int i = 0; i < size; i++)
{
tmp[i] = hashtable[i];
}
delete[] hashtable;
hashtable = tmp;
size = newsize; //crash
}
}
这里是 Node 类:
class Node
{
public:
string key;
V value;
Node* next;
Node* data;
Node(string key, V value)
{
this->key = key;
this->value = value;
this->next = NULL;
}
Node() {};
};
和HashTable类:
class HashTable
{
int size;
int current_size;
int cap;
float load;
Node **hashtable;
HashTable()
{
this->size = 5;
this->current_size = 0;
this->cap = 2;
this->load = 0.4;
this->hashtable = new Node*[size];
for (int i = 0; i < size; i++)
{
hashtable[i] = NULL;
}
}
}
我正在考虑为 resize 方法中的所有元素重做 addTo 方法,但我不知道这是否是问题所在。感谢您的帮助。
【问题讨论】:
-
那么当您离开
resize()时,您希望 hashtable[oldsize] 有什么价值? -
tmp中的许多元素没有被清空,但很难说这是否是真正的原因。在没有外部帮助的情况下,resize函数中的任何内容都不会导致崩溃。代码中的其他地方造成了致命的伤害,程序最终在resize中崩溃并死亡。