【发布时间】:2012-09-19 20:15:26
【问题描述】:
一段时间以来,我一直在努力理解它在 gdb 中的工作原理,但我很难理解它。基本上有一个数组(elements_),其中的东西被散列,这些东西是指向包含用于链接的某些钩子的结构的指针。这是一个示例结构:
struct foo
{
Data data;
foo* next;
foo** prevNext;
};
然后哈希表被实例化
HashTable<foo> hash;
它的插入函数看起来像这样(为了简单起见,我省略了调整大小和全部)
template <class T>
void HashTable<T>::insert(T* x)
{
int bucket = hashFunc(x->data);
T** xPtr = &elements_[bucket];
x->next = *xPtr;
x->prevNext = xPtr;
if (x->next)
x->next->prevNext = &x->next;
*xPtr = x;
}
去除如下
template<class T>
void HashTable<T>::remove(T* x)
{
if (x->next)
x->next->prevNext = x->prevNext;
*x->prevNext = x->next;
}
作为参考,它的搜索方式是这样的:
template<class T>
T* HashTable<T>::find(Data& data)
{
int bucket = hashFunc(data);
T* ptr = elements_[bucket];
while (ptr != 0)
{
if(ptr->data == data)
return ptr;
ptr = ptr->next;
}
return 0;
}
我一直在尝试跟踪 2-3 个碰撞元素的插入(通过将表大小设置为小开始)和删除以查看逻辑是什么,但我不明白。这是我认为删除操作(删除节点 2)正在做什么的图表,尽管我的脑海中仍然有点模糊:
【问题讨论】: