假设我使用自己的类作为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>
?
答案 0 :(得分:3)
有three std::unordered_map constructors将哈希和相等函数的实例作为参数。此示例显示如何使用其中一个:
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());
答案 1 :(得分: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==
。
即使这也可以通过模板参数进行自定义,我建议将其编写为全局函数。