我正在编写自己的哈希表实现。对于这个项目,我有一个std::list
数组,这是我存储数据的表。每个列表都包含std::pair
个对象。一对包含std::string
(人名)和指向自定义类对象的指针(包含有关该人的数据的类)。
我在执行用于在哈希表中插入数据的put()方法时遇到问题。这是我写的代码。
pair<string,StudentRecord*>* HashTable::put(string& p_Name, StudentRecord* p_StudentRecord){
std::pair<std::string, StudentRecord*> ptr = { p_Name, p_StudentRecord };
this->put(&ptr);
return &ptr;
}
void HashTable::put(pair<string, StudentRecord*>* p_HTElement){
string key = p_HTElement->first;
int storage_place = this->m_Hasher->hash(key) % this->m_Capacity;
this->m_Table[storage_place].push_back(p_HTElement);
this->m_NumberOfEntries++;
this->updateLoadFactor();
if (this->m_LoadFactor >= MAX_LOAD_FACTOR)
this->rehash();
}
当需要添加数据时,将调用第一个方法。此方法创建一个std::pair
对象,并将对该对象的引用传递给第二个方法。然后第二种方法计算哈希并将其放在std :: list数组中。然而问题是,在将它放入数组后,std::string
(该对的第一个元素)不再可读。当我查看调试器时,它只是说它的值是&#34;&#34;。在稍后阶段我想在哈希表中找到数据时,我的方法printHashTable()确实识别出它们是列表中的一对,但是它无法读取数据。再次使用调试器,它说
读取字符串
的字符时出错
对于该对的第一个元素,对于自定义对象,它显示为0xccccccccc
这是我需要打印哈希表中所有数据的方法:
void HashTable::printTable(){
for (int i = 0; i < this->m_Capacity; i++){
if (!this->m_Table[i].empty()) {
for (std::list<std::pair<std::string, StudentRecord*>*>::iterator element = this->m_Table[i].begin(); element != this->m_Table[i].end(); ++element) {
cout << (*element)->first << endl;
}
}
}
}
答案 0 :(得分:1)
存储指向对象引用的指针。但是当您离开第一个函数时,该对象会被取消引用,因此您将表指向未初始化的内存。我建议不要使用指针存储数据,但使用emplace
方法来避免复制。
std::list<std::pair<std::string, StudentRecord*>*>
不拥有它指向的对象,只有指针。
您必须制作副本,您可以通过将类型更改为:
来强制执行此操作 std::list<std::pair<std::string, StudentRecord*>>
你也必须调整你的m_Table类型,从你的例子中我看不出它是什么。
如果您想保留指针,则需要更改
std::pair<std::string, StudentRecord*> ptr = { p_Name, p_StudentRecord };
在堆上分配对象,而不是堆栈。 (即使用new
)