1

デフォルトとは異なるハッシャーを使用してハッシュテーブルを確立する必要があるため、次のように記述します。

class foo {
public:
...
private:
  struct myhasher {
    size_t operator() (myclass bar) { return hash_calculation bar; }
  }
  static size_t hash_calculation (myclass bar) {
    // do some calculation
  }
  hash_map<myclass, myhasher> myhashmap;
}

できます。なんらかの理由で、hash_calculation を置き換える非静的メンバー関数を作成する必要があります。たとえば、引数としてクラスの非静的メンバーが必要です。その後、ネストされた構造体で非静的メソッドを使用できないため、すべてが失敗しました。

これは、広く議論されている別の問題、つまり非静的関数を使用して比較またはソートを行う方法と似ています。例を参照してください: 比較関数内での非静的クラス メンバーの使用、オブジェクト インスタンスのメンバー変数に依存するカスタム コンパレーターを使用した C++ std リスト ソート。どちらもコンパレータとしての関数の代わりにファンクターを確立しました。ただし、私の場合、特定の構造体オブジェクトではなく、hash_map 定義内にクラス名が必要なため、このトリックは機能しません。私は何をすべきか?よろしくお願いします。

4

2 に答える 2

1

できません。を呼び出すときにhash_mapどのインスタンスを使用する必要があるかをどのように知ることになっていますか?myhashermyhaser::hash_calculation

hash_mapは標準の C++ ライブラリの一部ではなく、C++11 の一部でもないため、カスタム クラスであり、その動作に関する情報は含まれていません。使用する必要のあるある種のコンストラクター引数を取る方法があればmyhasher、幸運です。しかし、それはそのようには聞こえません。

また、おそらく const 参照を渡すつもりの場合は、値渡しを使用しています。値渡しは非常に遅く、非効率的です。

于 2012-10-25T18:36:07.220 に答える
0

標準の「ハッシュマップ」は、コンストラクター引数としてstd::unordered_map<K, V, H, E, A>型のハッシュオブジェクトを取ります。Hこのオブジェクトのコピーは、関数呼び出し演算子を使用してオブジェクトのハッシュを決定するために使用されます。この方法は、いくつかのコンテキストを提供できます。明らかに、あなたはすでに非静的関数呼び出し演算子を使用していましたが、静的メンバーに委任することを選択しました。

于 2012-10-25T19:06:29.040 に答える