C++初学者です。
分離チェイン法でハッシュ表を実装する課題に取り組んでいます。
find関数とinsert関数についてご教授していただきたいことがあります。色々なネットのページを見て自分なりに考えたのですが、あまり進みませんでした。
以下にコードとエラーメッセージを提示させていただきます。
まだあまりC++について深く理解しておらず、的外れなコードを書いてたり質問をしたりしているかもしれませんがどうかよろしくお願いします。
###ソースコード
C++
1#include<iostream> 2#include<list> 3#include<vector> 4#include<algorithm> 5#include<string> 6#include<new> 7 8using namespace std; 9 10class HashEntry { // key, value をセットで扱う 11 int key; 12 string value; 13 14public: 15 HashEntry(int k, string v) { key = k; value = v; }; 16 HashEntry() { key = 0; value = ""; }; 17 18friend class HashSeparate; 19}; 20 21class HashSeparate { 22 list<HashEntry>* table; // HashEntry の list の配列 23 int table_size; // ハッシュ表のサイズ 24 // 添字は [0 .. table_size-1] の範囲になる 25 int ndata; // 実際に登録されているデータ数 26 27public: 28 HashSeparate( int size ); 29 ~HashSeparate( ); 30 bool Insert( int key, string value ); 31 bool Find( int key, string & v ) const; 32 void Show() const; 33 34private: 35 int hash( int key ) const; // ハッシュ関数 36}; 37 38HashSeparate::HashSeparate( int size ){ 39 table = new list<HashEntry>[size]; 40 table_size = size; 41 ndata = 0; 42} 43 44HashSeparate::~HashSeparate( ){ 45 delete [] table; 46} 47 48// ハッシュ関数の一例.ハッシュ値は [0 .. table_size - 1] になる 49int HashSeparate::hash( int key ) const { 50 return key % table_size; 51}; 52 53 54bool HashSeparate::Insert( int k , string v ){ 55 int hi = hash(k); // ハッシュ値,つまり,配列の添字 56 string str; 57 if( Find( k, str ) ) // 同じkeyがすでに登録された 58 return false; 59 else { 60 table[hi][k]=v; //keyを挿入する 61 //(1)ここの書き方が間違っているのでしょうか。 62 ndata++; // データ数を更新する 63 return true; 64 } 65} 66 67bool HashSeparate::Find( int k , string & v) const { 68 int hi = hash(k); // ハッシュ値 69 list<HashEntry> l = table[hi]; 70 71 // 同じ key がすでに登録されたかを記録する.exists == true なら登録済み 72 bool exists = false; 73 if( !l.empty() ){ 74 list<HashEntry>::iterator itr; 75 for(itr = l.begin(); itr != l.end(); itr++) { 76 if (itr->key == k){ 77 exists = true; // あった 78 // (2)ここには何を追加すればいいのでしょうか。 79 return true; 80 break; 81 } 82 else return false; // なかった 83 } 84 } 85 86 return exists; 87} 88 89//ハッシュ表を表示させる 90void HashSeparate::Show() const { 91 for(int i = 0 ; i < table_size; i++) { 92 list<HashEntry> l = table[i]; 93 if( !l.empty() ){ 94 list<HashEntry>::iterator itr; 95 for(itr = l.begin(); itr != l.end(); itr++) 96 cout << "(" << itr->key << "," << itr->value << "). "; 97 cout << endl; 98 } 99 } 100} 101 102int main() { 103 HashSeparate lectureDay(3); 104 lectureDay.Insert(6, "June 16"); 105 lectureDay.Insert(7, "June 23"); 106 lectureDay.Insert(8, "June 30"); 107 lectureDay.Insert(9, "July 7"); 108 lectureDay.Show(); 109 110 int n = 3; 111 string val; 112 if ( !lectureDay.Find(n, val) ) 113 cout << n << " is not found." << endl; 114 else 115 cout << n << " is found. value = " << val << endl; 116 117 n = 9; 118 if ( !lectureDay.Find(n, val) ) 119 cout << n << " is not found." << endl; 120 else 121 cout << n << " is found. value = " << val << endl; 122 123 return 0; 124} 125
###エラーメッセージ
bool HashSeparate::Insert(int, std::string)’ 内: エラー: no match for ‘operator[]’ (operand types are ‘std::list<HashEntry>’ and ‘int’) table[hi][k]=v; //(1)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/15 12:07
2021/03/16 08:51 編集
2021/03/17 16:52