質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
ハッシュマップ

ハッシュ関数を用いてキーを関連する値にマッピングするデータ構造です。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

受付中

c++でハッシュテーブルを実装したいです。

saunashio
saunashio

総合スコア6

ハッシュマップ

ハッシュ関数を用いてキーを関連する値にマッピングするデータ構造です。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

2回答

0評価

0クリップ

468閲覧

投稿2021/06/11 09:08

c++でハッシュテーブルを実装したいです

こちら

を参考にして、ハッシュテーブルを実装しています。
リンク先のコードは正しく動くのですが、これをintではなく、charで実装したいです

ソースコードを
int k-> char k
int v ->char v
と安直に変更すると、「コンパイルは通りますが、正しく挙動しません」
型を変えたことによって他にも変えるべきところがあるのだと推察しておりますが、詳しく分かりません。(ハッシュ関数の計算の部分でしょうか?)
ご教授頂けましたら幸いです。

発生している問題・エラーメッセージ

文字列を入力するとメッセージが止まらず、無限に流れている。

該当のソースコード

c++

#include<iostream> #include<cstdlib> #include<string> #include<cstdio> using namespace std; const int T_S = 200; class HashTableEntry { public: char k; char v; HashTableEntry(char k, char v) { this->k= k; this->v = v; } }; class HashMapTable { private: HashTableEntry **t; public: HashMapTable() { t = new HashTableEntry * [T_S]; for (int i = 0; i< T_S; i++) { t[i] = NULL; } } int HashFunc(char k) { return (k % T_S); } void Insert(char k, char v) { int h = HashFunc(k); while (t[h] != NULL && t[h]->k != k) { h = HashFunc(h + 1); } if (t[h] != NULL) delete t[h]; t[h] = new HashTableEntry(k, v); } int SearchKey(char k) { int h = HashFunc(k); while (t[h] != NULL && t[h]->k != k) { h = HashFunc(h + 1); } if (t[h] == NULL) return -1; else return t[h]->v; } void Remove(char k) { int h = HashFunc(k); while (t[h] != NULL) { if (t[h]->k == k) break; h = HashFunc(h + 1); } if (t[h] == NULL) { cout<<"No Element found at key "<<k<<endl; return; } else { delete t[h]; } cout<<"Element Deleted"<<endl; } ~HashMapTable() { for (int i = 0; i < T_S; i++) { if (t[i] != NULL) delete t[i]; delete[] t; } } }; int main() { HashMapTable hash; char k, v; int c; while (1) { cout<<"1.Insert element into the table"<<endl; cout<<"2.Search element from the key"<<endl; cout<<"3.Delete element at a key"<<endl; cout<<"4.Exit"<<endl; cout<<"Enter your choice: "; cin>>c; switch(c) { case 1: cout<<"Enter element to be inserted: "; cin>>v; cout<<"Enter key at which element to be inserted: "; cin>>k; hash.Insert(k, v); break; case 2: cout<<"Enter key of the element to be searched: "; cin>>k; if (hash.SearchKey(k) == -1) { cout<<"No element found at key "<<k<<endl; continue; } else { cout<<"Element at key "<<k<<" : "; cout<<hash.SearchKey(k)<<endl; } break; case 3: cout<<"Enter key of the element to be deleted: "; cin>>k; hash.Remove(k); break; case 4: exit(1); default: cout<<"\nEnter correct option\n"; } } return 0; }

試したこと

int k-> char k
int v ->char v
と変更してみた。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

asm

2021/06/11 10:13

> 文字列を入力するとメッセージが止まらず、無限に流れている。 具体的に何を入力したのでしょうか? charなのですからk,vともに1文字までしか入りませんよね?
saunashio

2021/06/12 01:17

ご返信ありがとうございます。 charを数文字入れました。 そうでした、charの配列にしてみます。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

ハッシュマップ

ハッシュ関数を用いてキーを関連する値にマッピングするデータ構造です。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。