unordered_set是C++中的哈希,如果想让自定义的class作为key(unordered_set<key,value>)来使用unordered_set,需要实现:
(1) 哈希函数,需要实现一个class重载operator(),将自定义class变量映射到一个size_t类型的数。一般常用std::hash模板来实现。
(2) 判断两个自定义class类型的变量是否相等的函数,一般在自定义class里重载operator==。
示例代码:
class Myclass
{
public:
int first,second;
bool operator== (const Myclass &other) const
{
return first == other.first && second == other.second;
}
};
namespace std
{
template <>
struct hash<Myclass>
{
size_t operator()(const Myclass &k) const
{
int a = k.first;
int b= k.second;
return a^b;
}
};
}
unordered_map是C++中的哈希表,可以在任意类型与类型之间做映射。
如果想让自定义的class作为key(unordered_map<key,value>)来使用unordered_map,需要实现:
(1) 哈希函数,需要实现一个class重载operator(),将自定义class变量映射到一个size_t类型的数。一般常用std::hash模板来实现。
(2) 判断两个自定义class类型的变量是否相等的函数,一般在自定义class里重载operator==。
示例代码:
class Myclass
{
public:
int first;
vector<int> second;
// 重载等号,判断两个Myclass类型的变量是否相等
bool operator== (const Myclass &other) const
{
return first == other.first && second == other.second;
}
};
// 实现Myclass类的hash函数
namespace std
{
template <>
struct hash<Myclass>
{
size_t operator()(const Myclass &k) const
{
int h = k.first;
for (auto x : k.second)
{
h ^= x;
}
return h;
}
};
}