为什么我需要一个对象数组的双指针? C ++中的HashMap示例

时间:2017-08-02 18:49:52

标签: c++ pointers double-pointer

我正在练习一些C ++而且我很困惑为什么我需要一个对象数组的双指针(例如节点结构)。这是一个简单的代码片段来解释我的情况:

struct HashNode{

    HashNode* next;
    int data;
    int key;
    int hashCode;

    HashNode::HashNode(
        HashNode* next, 
        const int& data, 
        const int& key, 
        const int& hashCode
        ) : next(next), data(data), key(key), hashCode(hashCode)
        {}

};

class HashMap{
    public:
        HashMap();
        HashMap(int tableSize);
        ~HashMap();

    private:
        //Here is the double pointer
        HashNode** table;
};

HashMap::HashMap(){
    //Here is the array initialization 
    table = new HashNode*[100];
}

我删除了问题所不需要的代码。

如果我删除双指针:

HashNode* table;

table = new HashNode[100];

我收到以下错误。

hashmap.cpp: In method `HashMap::HashMap()':
hashmap.cpp:87: no matching function for call to `HashNode::HashNode ()'
hashmap.cpp:61: candidates are: HashNode::HashNode(const HashNode &)
hashmap.cpp:58:                 HashNode::HashNode(HashNode *, const int &, cons
t int &, const int &)

向我展示了HashNode尝试运行构造函数。

如果我在保留table = new HashNode*[100];的同时仅将数组的初始化更改为HashNode* table;,则会出现以下错误。

hashmap.cpp: In method `HashMap::HashMap()':
hashmap.cpp:87: assignment to `HashNode *' from `HashNode **'

我的假设是,当我创建一个对象数组时,我还需要在程序的持续时间内使用对象的生命周期。这需要我为对象和数组使用指针。因此,我需要有数组的双指针,因为它指向指针,我需要指针对象。

然而,我仍然不确定,我无法在网上找到任何好的解释。有人可以解释一下这种情况吗?

3 个答案:

答案 0 :(得分:1)

此实现使用separate chaining with linked lists来管理哈希冲突。因此,table是指向HashNode的指针数组,这意味着它需要两个星号:

  • 一个星号来自数组元素的类型,即HashNode*
  • 另一个星号来自制作HashNode*
  • 的数组

这也是new表达式中带星号的原因:

table = new HashNode*[100];
//                  ^

答案 1 :(得分:0)

看起来你对c ++指针很新。 你目前正在做的是制作100个指针的数组。所以编译器没有给你任何错误,因为实际的对象不是用这一行创建的。 HashNode ** table = new HashNode * [100];

但是当你使用的时候 HashNode * table = new HashNode [100]; 然后你试图为HashNode创建100个对象; 但是你没有默认的构造函数,所以编译器会给你上面的错误。

我附上了以下工作代码。看看吧。

    #include <iostream>
    using namespace std;

    struct HashNode{

        HashNode* next;
        int data;
        int key;
        int hashCode;

        HashNode(){}

        HashNode(
            HashNode* next, 
            const int& data, 
            const int& key, 
            const int& hashCode
            ) : next(next), data(data), key(key), hashCode(hashCode)
            {}

    };

    class HashMap{
        public:
            HashMap();

        private:
            //Here is the double pointer
            HashNode* table;
    };

    HashMap::HashMap(){
        //Here is the array initialization 
        table = new HashNode[100];
    }

    int main() {
        // your code goes here

        HashMap ob;
        std::cout << "him" <<  std::endl;
        return 0;
    }

答案 2 :(得分:0)

在这里您要声明指针数组

HashNode **表;

这是一个名为table的数组,其指针的类型为hashNode。