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

三个 std::unordered_map 构造函数,它们将哈希和相等函子的实例作为参数。此示例显示如何使用其中之一:

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 回答