私は勉強の最初の学期にいて、コンプの一部です。ベクトルを使用して単純なハッシュ マップを実装する必要がありますが、概念を理解するのに問題があります。
まず、ハッシュ関数を実装する必要があります。衝突を避けるには、次のようにダブルハッシュを使用する方がよいと考えました。
do {
h = (k % m + j*(1+(k % (m-2)));
j++;
} while ( j % m != 0 );
ここで、h は返されるハッシュ、k はキー、m は hash_map のサイズ (および素数。これらはすべて int 型です) です。
これは簡単でしたが、マップ内のキーと対応する値のペアを挿入または削除できる必要があります。
2 つの関数のシグネチャは bool でなければならないので、true または flase のいずれかを返す必要があります。ベクトルの位置 h に要素がない場合は true を返す必要があると推測しています。(しかし、remove も bool にする必要がある理由がわかりません)。
私の問題は、挿入関数が false を返した場合 (つまり、位置 h にキーと値のペアが既に保存されている場合 - これを find という名前の関数として実装した場合) に何をすべきかです。単純に j を増やすだけで次の空いている場所に移動できることは明らかですが、ハッシュ関数によって計算されたハッシュは、特定のキーが保存されている場所を教えてくれなくなり、remove 関数の間違った動作を引き起こします。
定義済みの STD メソッドを使用しないオンラインの良い例はありますか? (ここ数日、私の Google はおかしな動作をしており、役に立たないヒットをローカル言語で返すだけです)