2 つの質問があります。まず、ハッシュ テーブルを作成しようとしています。配列を正しくインスタンス化していますか? 連鎖のためにリンクリストへのポインターの動的配列を作成しようとしています: リンクリストノードは値によって格納されます。よくわかりませんが、ItemType** 構文が間違っていると思います。これが私の理解です。間違っている場合は修正してください。
最初の * は 'HashArray' を配列としてインスタンス化し、次に 2 番目の * はそれを各リンク リストの先頭へのポインターの配列としてインスタンス化します。ノードを指している必要があります。Node は LinkedList 内にネストされています。公開なのに。とにかく、これはばかげているように聞こえますが、「LinkedList::Node::ItemType** HashArray」の行に沿って何かを読み取る必要がありますか? 助言がありますか?
編集:簡単にするために、コピー/削除/割り当てコンストラクターを含めませんでした:
編集2:「ハッシュ」/「成長関数」/「縮小関数」も含めませんでした。明らかに、削除関数などを作成しても、挿入が作成され、テンプレートが事前に機能するまでは意味がありません...私が持っているものをもっと投稿すると役立つかどうか教えてください。今、コンパイルエラーが発生しています
C2440: '=' : 行の 'list< type >' *' から 'std::string *'
に 変換できません
HashArray[インデックス] = LinkedList;
それは問題を突き止めるのに役立つはずです
template <typename ItemType>
class HashSet {
int oldCapacity;
int capacity;
int size;
ItemType** HashArray;
HashSet() {
HashArray = new ItemType*[capacity] ;
memset(HashArray, 0, sizeof(ItemType*)*capacity);
size=0;
capacity = 0;
oldCapacity = 0;
}
void insert(const ItemType& item){
list <ItemType> *LinkedList= new list<ItemType>();
unsigned int index = hash(item);
if(HashArray[index]== NULL)
{
LinkedList->pushback(item);
HashArray[index] = LinkedList;
}
else if(!LinkedList->find(item)) //if it's not in the list
{
LinkedList->pushback(item);
HashArray[index] = LinkedList;
}
else //in list already
return;
}
}