0

私はハッシュテーブルを作成しようとしていますが、オンラインチュートリアルを使用して学んだことから、次のコードを思いつきました。

#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を出力するにはどうすればよいですか。

どんな助けでも大歓迎です。

ビッシュ

4

2 に答える 2

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 が実行されます)。これはまったく -- 技術的な詳細に関係なく、明らかに望んでいるものではなく、修正する必要があります)。

私が言ったように、私はコードの 1 つの場所をちらりと見ただけで見つけました。肝心なのは、おそらく少し前に戻って、各機能が何をすべきかを理解し、それらを 1 つずつ調べて、それぞれが本来の目的を果たしていることを確認する必要があるということです。

もう 1 つアドバイスがあります。独自に配列を動的に割り当てるのではなく、std::vector.

于 2012-05-13T17:21:08.173 に答える
0

単に stl ハッシュマップを使用するか、スレッドセーフなハッシュマップの場合は intel スレッド ビルディング ブロック ライブラリを使用します

于 2012-05-13T18:46:10.327 に答える