HashTable实现获取和设置运算符重载

时间:2016-07-29 22:45:22

标签: c++ c++11 hashtable

我正在尝试实施 基本 哈希表。我使用链表来解决冲突。

我的获取设置方法给我带来了一些麻烦,而且我不确定问题是什么。我相信我正确地重载了​​运营商。我认为当我附加到链接列表时会出现问题。

class HashTable {
  struct Node{
    int key;
    int value;
    Node *next;
  };
  Node **table;
  int hash_func(int key) const {
    return key % TABLE_SIZE;
  }
public:
  HashTable() {
    table = new Node*[TABLE_SIZE]();
    for (int i = 0; i < TABLE_SIZE; ++i)
      table[i] = nullptr;
  }

  int& operator[](int const key) {
    int h_key = hash_func(key);

    while(table[h_key]) {
      table[h_key] = table[h_key]->next;
    }

    table[h_key] = new Node;
    table[h_key]->key = key;
    table[h_key]->next = table[h_key];

    return table[h_key]->value;
  }

  int operator[](int const key) const {
    int h_key = hash_func(key);

    while (table[h_key]) {
      if (table[h_key]->key == key) {
        return table[h_key]->value;
      }
      table[h_key] = table[h_key]->next;
    }
    return 0;
  }
};

3 个答案:

答案 0 :(得分:3)

您的问题是,您在获取和设置方法中的while循环中覆盖数据。

执行table[h_key] = table[h_key]->next;时,永久丢失最初存储在h_key位置的内容。而是使用占位符,如下所示:

Node * curr = table[h_key];
while (curr->next)
{
  curr =  curr->next;
}

Node * new_node = new Node;
new_node->key = key;
curr->next = new_node;

你的get方法遇到了类似的问题。

答案 1 :(得分:2)

在你的setter中,你想在最后插入一个新元素。所以首先你会发现这样的结局:

while(table[h_key]) {
  table[h_key] = table[h_key]->next;
}

然后,你设置:

table[h_key]->next = table[h_key];

相反,您必须设置:

table[h_key]->next = nullptr;

否则,您在循环中的条件不起作用。

考虑一下@ bpachev答案补遗的答案。我的代码只使用错误的代码说明了问题,而不是一个简单的解决方案。

答案 2 :(得分:0)

我同意bpachev。因为这是C ++,所以你应该考虑使用这样的模板(去除杂乱和重用)。使用模板类的开销很小,此过程在编译期间完成。