2014-04-27 53 views
0

我正在编写自己的散列表实现。对于这个项目,我有一个数组std::list,这是我存储数据的表格。每个列表由std::pair对象组成。一对包含std::string(人的姓名)和一个指向自定义类(包含关于该人的数据的类)的对象的指针。在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(该对的第一个元素)不再可读。当我看着调试器时,它只是说它的值是“”。在后面的阶段中,我想查找散列表中的数据,我的方法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

你的成员变量的类型是什么? – tillaert

+0

返回指向局部变量的指针... –

+0

自定义类StudentRecord的成员变量?学生记录仅包含std :: string和int变量。 @MarcGlisse我明白了。但是,如果我需要创建一个新的对象,并且它不能在方法put()中创建,那么我该怎么做呢? –

回答

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

+0

感谢您的回答。我有一个关于该项目的指导方针的pdf,它说我的std :: list应该包含std :: pair对象的指针,这与你说的相反。 –

+0

在这种情况下,您需要新建该对象,以在堆上而不是堆栈上创建它。对于pre-C++ 11,指导方针更为高效,但缺点是,您必须手动管理所有内存。问题在于你在堆栈上创建了一个对象,当你退出你的第一个函数时会消失。稍后,在打印过程中,您尝试访问不再存在的对象。 – tillaert

相关问题