以下是使用C++实现哈希表的方法。您能帮我了解HashEntry **table是什么吗?为什么将其声明为双指针?它是一个数组,数组的每个值都是HashEntry吗?

  class HashEntry {
    private:
          int key;
          int value;
    public:
          HashEntry(int key, int value) {
                this->key = key;
                this->value = value;
          }

          int getKey() {
                return key;
          }

          int getValue() {
                return value;
          }
    };

    const int TABLE_SIZE = 128;






    class HashMap {
    private:
          HashEntry **table;
    public:
          HashMap() {
                table = new HashEntry*[TABLE_SIZE];
                for (int i = 0; i < TABLE_SIZE; i++)
                      table[i] = NULL;
          }

          int get(int key) {
                int hash = (key % TABLE_SIZE);
                while (table[hash] != NULL && table[hash]->getKey() != key)
                      hash = (hash + 1) % TABLE_SIZE;
                if (table[hash] == NULL)
                      return -1;
                else
                      return table[hash]->getValue();
          }

          void put(int key, int value) {
                int hash = (key % TABLE_SIZE);
                while (table[hash] != NULL && table[hash]->getKey() != key)
                      hash = (hash + 1) % TABLE_SIZE;
                if (table[hash] != NULL)
                      delete table[hash];
                table[hash] = new HashEntry(key, value);
          }

          ~HashMap() {
                for (int i = 0; i < TABLE_SIZE; i++)
                      if (table[i] != NULL)
                            delete table[i];
                delete[] table;
          }
    };

最佳答案

在此代码中,table是指向HashEntry的指针

HashEntry **table;

一般规则是从变量名和基本类型开始,尽可能右移然后左移,请参阅此出色的说明

http://unixwiz.net/techtips/reading-cdecl.html

因此,从变量table和最左侧的基本类型HashEntry开始。请注意,本文描述了“C”的规则,其中基本类型可以是struct,请将您的C++类HashEntry视为“C”结构。
table is ... HashEntry
声明中table的右边没有其他内容,因此向左走,您将获得“*”,它表示指向以下各项的指针:
table is pointer to ... HashEntry
同样,您必须在声明中左移并使用下一个“*”,现在您有了
table is pointer to pointer to HashEntry
...您就完成了。

不幸的是,那样声明了table,因为表隐含了数组,而没有将其声明为数组。事实证明,在C++中,就像在C中一样,数组在传递给函数时会“衰减”为指针。这里的“衰减”表示您丢失了信息,即数组的大小。

我认为可以为读者提供更多理解的等效声明是:
HashEntry * table[];

使用有关如何解释变量声明的规则,应将其理解为
table is undimensioned array of pointer to HashEntry
从编译器的角度来看,这等效于先前的声明,因为将无维数组作为指向数组元素类型的指针(该值是第一个元素的地址,偏移量为0)传递。 “维数组”也将衰减为指针,从而丢失维度信息。请参阅此SO答案以获取有关衰减数组的更多信息。

What is array decaying?

10-07 15:35