在std :: pair中存储std :: string和自定义对象

时间:2014-04-27 17:43:33

标签: c++ c++11 hash stl

我正在编写自己的哈希表实现。对于这个项目,我有一个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;
            }
        }
    }
}

1 个答案:

答案 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