我正在实现哈希表,但在实现方面遇到麻烦。经过数小时的搜索,我放弃了,希望看到我可以在这里得到任何帮助。最大的问题是与在HashTable中使用向量有关(对我而言没有意义,而是仅使用list <>但必须使用它)
我的主要问题是如何实现将插入功能添加到HashTable中。
void HashTable::insert(ulint key,ulint value){ //insert data associated with key
HashNode nodeToAdd;
nodeToAdd.assign(key, value);
int index = hash_function(key);
this->table[index].push_back(nodeToAdd);
}
现在我正在将HashNode添加到我的HashTable中。
供HashTable参考,该表的字段为
typedef vector <list<HashNode> > Table;
Table *table;
据我所知
this->table[index].push_back(nodeToAdd);
转到向量HashTable [index],该向量在索引处应该是一个列表。并且到达该列表时,应将新节点推回列表中。
但是,当编译时,我遇到一个错误(没有匹配的函数要调用),并且我不明白为什么。
答案 0 :(得分:0)
您的列表存储的类型为HashNode
的对象,不是类型为HashNode*
的对象。
因此,您需要确定要使用的代码,并相应地更改代码。
如果您想继续存储HashNode
,那么您的insert
是错误的,它应该在堆栈上创建节点并将其按值存储在列表中。
如果要存储指针,则您的Table
类型是错误的,而应该是vector<list<HashNode*>>
-请注意,由于指针不会被自动删除,因此应谨慎管理
就个人而言,我建议您选择#1,这样可以避免很多麻烦。但是,如果您坚持使用#2,那么我建议您停止使用malloc
并使用new
,或者最好使用std::unique_ptr
或std::shared_ptr
进行自动生命周期管理。>
值得注意的是您的定义Table *table
。这令人困惑,因为Table
是向量。您的insert
函数正在取消引用此指针,希望它可能指向Table
值的数组,当您很清楚您实际上认为它是一个向量时。我很确定你不希望它成为一个指针。
由于我只是注意到了这一细节,所以我想这是您错误的 first 来源,因为table[index]
实际上是类型Table
,而不是类型list<HashNode>
并且您试图调用不存在的函数vector<list<HashNode>>::push_back(HashNode*)
。