KeyValuePairs列表的数组,使用链接管理模板哈希表

时间:2013-04-19 19:31:59

标签: c++ hashtable

所以我正在开展一个项目,旨在帮助我更多地了解哈希表

但是,我在实现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);
}

过去几天我一直在研究这个问题,真的需要一些新的眼睛来看看我在做什么,并肯定或协助我的思考......

2 个答案:

答案 0 :(得分:0)

为什么要删除构造函数中的Data

HashTable(const int& size = INITIAL_SIZE)
{
    Keys = 0;
    Size = size;
    if(size!=INITIAL_SIZE)
    {
        delete[] Data;  <------------
        Data = new list<KeyValuePair>[Size];
    }
}

没有什么可以删除,只需要

 HashTable( int size = INITIAL_SIZE)
{
    assert ( size > 0 );
    Keys = 0;
    Size = size;
    Data = new list<KeyValuePair>[Size];
}

while(hashIndex>Size)
{
    hashIndex-=Size;
}
//Data[hashIndex]->push_back(value);
Data[hashIndex].merge(*newHash);

如果hashIndex == Size,您将访问一个超出界限的元素。

答案 1 :(得分:0)

想出来了!

因此,最困难的问题之一是在调试窗口中没有任何方法可以查看数组指针的数据元素,因为它总是只指向数组的开头或某个点。 / p>

但是,无论如何,(除了修复原始代码中的内存泄漏)主要问题是(正如我想的那样)我试图将初始化的链表合并到没有初始化的。

解决这个问题,在下面的代码片段中,我使用了std :: list.push_back()函数。其中初始化列表并且不会覆盖该哈希索引中可能已存在的任何值。

为了检查我是否实际上是散列值,我创建了一个搜索函数(给定一个数据值)找到索引并输出保存在该索引处的字符串。

void Insert(const DATA_TYPE& value)
{
    int hashIndex;
    hashIndex = HashCode(value);

    KeyValuePair newPair = KeyValuePair(hashIndex, value);

    while(hashIndex>Size)
    {
        hashIndex-=Size;
    }

    Data[hashIndex].push_back(newPair);
}

(遗憾的是,我必须等待才能发布答案)