だから私は現在、ハッシュテーブルについてもっと教えてくれることを目的としたプロジェクトに取り組んでいます
ただし、KeyValuePair 型のテンプレート リンク リストの配列であると想定される HashTable のデータ メンバーを実装するのは非常に困難です。
プログラムの要件の 1 つは、連鎖アドレッシングを実装することと、ユーザーがデータ配列の長さを初期化できることです。そのため、リンク リストの配列を使用することを余儀なくされています。
Data メンバーへの挿入に問題があるため、Data メンバーの宣言 (次のコード セグメントの下部) に何か問題があるのではないかと推測しました。
template <typename DATA_TYPE>
class HashTable
{
typedef pair<const int, DATA_TYPE> KeyValuePair;
private:
int Size;
int Keys;
list<KeyValuePair>* Data;
私が理解しているように、これにより、リンクされたリストの配列の要素を指すことができるはずです。
しかし、配列の初期化 (および配列への挿入。これについては後で説明します) に関しては、何が問題なのかよくわかりません。
これは私のコンストラクタとデストラクタです:
public:
HashTable(const int& size = INITIAL_SIZE)
{
assert( size > 0 );
Keys = 0;
Size = size;
Data = new list<KeyValuePair>[Size];
/*for(int i = 0; i<Capacity; i++)
Data[i] = new list<DATA_TYPE>;*/
}
~HashTable()
{
delete[] Data;
}
これは私の挿入関数で、std::list でブレークポイントが発生します。これは、list.merge() で NULL の ".Next" ポインターにアクセスしようとしているために発生したと思います。確信はないけど:
void Insert(const DATA_TYPE& value)
{
int hashIndex;
hashIndex = HashCode(value);
KeyValuePair* newPair = new KeyValuePair(hashIndex, value);
list<KeyValuePair>* newHash = new list<KeyValuePair>;
newHash->push_back(*newPair);
while(hashIndex>Size)
{
hashIndex-=Size;
}
//Data[hashIndex]->push_back(value);
Data[hashIndex].merge(*newHash);
}
私はここ数日間これに取り組んできたばかりで、私がしていることを見て、私の考えを肯定または支援するために、本当に新鮮な目が必要です...