在C ++中实现hash-table

时间:2016-11-07 01:29:24

标签: c++ hash hashmap hashtable

以下是使用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;
          }
    };

1 个答案:

答案 0 :(得分:5)

在此代码中,table是指向HashEntry

的指针
HashEntry **table;

一般规则是从变量名称和基本类型开始,尽可能向右走,然后向左走,看看这个优秀的描述

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

所以你从变量table开始,以及最左边的基本类型HashEntry。请注意,该文章描述了C&#39; C&#39;基本类型可以是struct,将C ++类HashEntry视为&#39; C&#39;结构

table is ... HashEntry

声明中table的权利没有别的,所以请左转,你有&#34; *&#34;它代表指向的指针:

table is pointer to ... HashEntry

再次,您必须在声明中左转并消耗下一个&#34; *&#34;,您现在已经

table is pointer to pointer to HashEntry

......你已经完成了。

或许不幸的是table被声明了这种方式,因为table表示数组,并且它没有被声明为数组。事实证明,在C ++中,如在C中,数组&#34;衰变&#34;将它传递给函数时转换为指针。在这里&#34;衰变&#34;意味着您丢失了信息,即数组的大小。

一个等价的声明,我认为会给读者更多的洞察力:

HashEntry * table[];

使用有关如何解释变量声明的规则,这应该被理解为

table is undimensioned array of pointer to HashEntry

从编译器的角度来看,这相当于前一个声明,因为 undimensioned array 作为指向数组元素类型的指针传递(值为第一个元素的地址,偏移量为0)。一个&#34;尺寸的数组&#34;随着尺寸信息的丢失,也会衰减到指针。有关将数组衰减到指针的更多信息,请参阅此SO答案。

What is array decaying?