所以我目前正在做一个项目,旨在帮助我更多地了解哈希表
但是,我在实现 HashTable 的数据成员时遇到了重大困难,该成员应该是模板链接列表的数组,其类型为 KeyValuePair。
该程序的要求之一是我实现了链式寻址,并且允许用户初始化 Data 数组的长度,所以我几乎被迫使用链表数组。
由于我在插入 Data 成员时遇到问题,我假设我的 Data 成员声明可能有问题(在以下代码段的底部):
template <typename DATA_TYPE>
class HashTable
{
typedef pair<const int, DATA_TYPE> KeyValuePair;
private:
int Size;
int Keys;
list<KeyValuePair>* Data;
据我了解,这应该允许我指向链接列表数组的元素。
但是,当涉及到初始化我的数组(并插入到我的数组中,稍后我将向您展示)时,我不太清楚出了什么问题。
这是我的构造函数和析构函数:
public:
HashTable(const int& size = INITIAL_SIZE)
{
assert( size > 0 );
Keys = 0;
Size = size;
Data = new list<KeyValuePair>[Size];
/*for(int i = 0; i<Capacity; i++)
Data[i] = new list<DATA_TYPE>;*/
}
~HashTable()
{
delete[] Data;
}
这是我的插入函数,它会导致在 std::list 中出现断点,这(我认为)是因为我试图使用 list.merge() 访问 NULL“.Next”指针。但我不确定:
void Insert(const DATA_TYPE& value)
{
int hashIndex;
hashIndex = HashCode(value);
KeyValuePair* newPair = new KeyValuePair(hashIndex, value);
list<KeyValuePair>* newHash = new list<KeyValuePair>;
newHash->push_back(*newPair);
while(hashIndex>Size)
{
hashIndex-=Size;
}
//Data[hashIndex]->push_back(value);
Data[hashIndex].merge(*newHash);
}
过去几天我一直在做这件事,真的需要一些新鲜的眼睛来审视我正在做的事情,并确认或帮助我的想法......