【问题标题】:C++ Hash Chaining FunctionC++ 哈希链函数
【发布时间】:2012-05-13 16:37:44
【问题描述】:

我正在尝试构建一个哈希表,根据我使用在线教程学到的知识,我想出了以下代码

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;
const int SIZE = 100;

int hash(string);

class Node
{
   public:
      Node();
      Node(string);
      int hash(int value);
   private:
      string data;
      Node* next;

   friend class HashTable;
};

Node::Node() {
  data = "";
  next = NULL;
}

Node::Node(string) {
  data = "";
  next = NULL;
}

int Node::hash(int value) {
   int y;
   y = value % SIZE;
}

class HashTable {
public:
    HashTable();
      HashTable(int);
      ~HashTable();
      void insertItem(string);
      bool retrieveItem(string);

private:
      Node* ht;
};

HashTable::HashTable() {
  ht = new Node[SIZE];
}

HashTable::HashTable(int max) {
  ht = new Node[max];
}

HashTable::~HashTable() {
   delete[] ht;
}

void HashTable::insertItem(string name) {
    int val = hash(name);
    for (int i = 0; i < name.length(); i++)
        val += name[i];
}

bool HashTable::retrieveItem(string name) {
    int val = hash(name);
    if (val == 0 ) {
        cout << val << " Not Found " << endl;
    }
    else {
        cout << val << "\t" << ht->data << endl;
    }
}

void print () {
    //Print Hash Table with all Values
}

int main() {

   HashTable ht;
   ht.insertItem("Allen");
   ht.insertItem("Tom");

   ht.retrieveItem("Allen");

   //data.hash(int val);
   //cout << ht;

   system("pause");
   return 0;
}


int hash(string val) {
    int key;
    key = val % SIZE;
}

我正在尝试插入字符串值并使用retrieveItem 函数验证名称是否存在。 另外,我该如何打印带有值的 HashTable。

我们将不胜感激。

维什

【问题讨论】:

  • 我的代码不起作用!代码的哪一部分是错误的?或者如果整个代码都错了,解决办法是什么?
  • 错的地方很多;如果你有两个构造函数并且不保存长度,你怎么知道数组有多大?你为什么要在字符串上使用模数?您实际上并没有在insertItem 中插入任何内容,也没有在retrieveItem 中返回任何内容。
  • 我想使用模来获取字符串的 ascii 值,并使用 ascii total % size = index position in table 并将字符串存储在那里。例如对于字符串“Allen”,总 ascii 值为 476 % 101(表大小)给我 76 作为索引表中存储数据的位置。
  • 转向像const std::string&amp; 这样的方法签名,而不是stringusing namespace std is something you'll want to avoid,它会引起很多混乱和冲突。传递const 引用可避免重复参数和意外突变。

标签: c++ function hashtable chaining


【解决方案1】:

这里有点不对劲。随便扫了一眼代码中间的一个点,我发现:

Node::Node(string) {
  data = "";
  next = NULL;
}

这不会保存传入的字符串的值。我猜你真的想要更像:

Node::Node(string value) : data(value), next(NULL) {}

接下来我看到的是:

int Node::hash(int value) {
   int y;
   y = value % SIZE;
}

这会计算一个值并将其放入y(一个局部变量),但不会返回任何内容,因此您计算的值会立即丢失。如果你尝试使用它的返回值,你会得到未定义的行为(实际上,我不记得了——似乎在 C 中你只有在尝试使用返回值时才会得到 UB,但在 C++ 中它是 UB这一点都没有——不管技术细节如何,这显然不是你想要的,需要修复)。

就像我说的,我只是看了一眼代码中的一个地方,但发现——我怀疑它们是唯一的问题。最重要的是,您可能需要稍微备份一下,弄清楚每个功能应该做什么,然后一个接一个地检查它们,并确保每个功能都在做它应该做的。

另外一点建议:我没有自己处理动态分配数组,而是使用了std::vector

【讨论】:

  • 谢谢杰瑞!我将研究这些功能。我刚开始学习 C++,所以边学边学...
【解决方案2】:

只使用 stl hashmap 或者 对于线程安全的 hashmap,使用英特尔线程构建块库

【讨论】:

  • 谢谢凯!但是我是初学者,所以不知道您的意思;)。我正在尝试使用链表和哈希链接来做到这一点
猜你喜欢
  • 2011-11-05
  • 2013-01-05
  • 2015-06-22
  • 1970-01-01
  • 2015-04-11
  • 2023-03-04
  • 2016-03-25
  • 2011-02-27
  • 2010-10-12
相关资源
最近更新 更多