1

自分のクラスをキーとして使用しているとしますstd::unordered_map

class MyClass {
public:
    int a, b;
}

www.cplusplus.comには、使用できる次のコンストラクターがリストされています。

explicit unordered_map ( size_type n,
                         const hasher& hf = hasher(),
                         const key_equal& eql = key_equal(),
                         const allocator_type& alloc = allocator_type() );

上記のコンストラクターを使用して、すべてのパラメーターを作成する方法の例を教えてくださいstd::unordered_map<MyClass, std::string>

4

2 に答える 2

3

ハッシュ関数と等価関数のインスタンスをパラメーターとして受け取る3つのstd::unordered_mapコンストラクターがあります。この例は、それらの1つを使用する方法を示しています。

struct MyHash {
  std::size_t operator()(const MyClass& k) const { .... }
};

struct MyEqual {
  bool operator()(const MyClass& lhs, const MyClass& rhs) const { .... }
};

std::unordered_map<MyClass, std::string, MyHash, MyEqual> m(42, // bucket count 
                                                            MyHash(), 
                                                            MyEqual());
于 2013-03-24T17:39:17.007 に答える
1

内部でキーとして使用できるクラスをunordered_map作成するのは無料ではありません。そのためのカスタムハッシュオブジェクトが必要です。

struct MyHash {
  std::size_t operator()(const MyClass& k) const
  {
    // You may want to use a better hash function
    return static_cast<std::size_t>(k.a) ^ static_cast<std::size_t>(k.b);
  }
}; 

次に、ハッシュ関数をテンプレートパラメーターとしてマップに渡します(デフォルトのコンストラクターを使用してハッシュオブジェクトを構築するため、手動で渡す必要はありません)。

std::unordered_map<MyClass, std::string, MyHash> m;

stdまたは、名前空間内にハッシュ関数を提供することもできます。

namespace std {
  template <>
  struct hash<MyClass> {
    std::size_t operator()(const MyClass& k) const; // same as before
  };
}

さて、それはまさに期待通りです:

std::unordered_map<MyClass, std::string> m;

の特別な要件に加えてunordered_map、を定義する必要もありますoperator==。テンプレートパラメータを使用してこれをカスタマイズすることもできますが、グローバル関数として記述することをお勧めします。

于 2013-03-24T17:26:08.853 に答える