1、C++ map/unordered_map怎么设置自定义哈希函数(Hash)和相等函数(equal_to)
使用map或unordered_map,key为自定义类对象或指针时,需要为map提供哈希函数和比较函数,这里举个简单例子说明。
class MyClass {
private:
std::vector
public:
MyClass(){}
std::string GetStr() const {
std::string str;
for (auto x: _data ) str += std::to_string(x);
return str;
}
bool operator==(const MyClass &n) const
{
return _data == n._data;
}
};
此时如果要把MyClass作为unordered_map的关键字,就需要指定如下哈希函数,因为类中重载了==符号,所以此时不需要指定Equal函数:
structMyClassHash{
size_toperator()(constMyClass &cla)const{
std::string str = cla.GetStr();returnstd::hash()(str);
}};
则我们的unordered_map如下:
std::unordered_map
如果类中没有重载==函数,则修改上述代码如下:
#include
#include
class MyClass {
private:
std::vector
public:
MyClass(){}
std::string GetStr() const {
std::string str;
for (auto x: _data ) str += std::to_string(x);
return str;
}
};
struct MyClassHash {
size_t operator()(const MyClass &cla) const {
std::string str = cla.GetStr();
return std::hash
}
};
struct MyClassEqual {
bool operator()(const MyClass &c1, const MyClass &c2) const {
return c1.GetStr() == c2.GetStr();
}
};
std::unordered_map
还有一种情况是关键字为指针,这种情况我还没搞懂怎么实现相等函数,等知道了再补上。
2、map/unordered_map的键值为指针,怎么delete
unordered_map
上述代码中Node是自定义类,Hash和Equ分别是自定义的哈希函数和相等函数。
_nodes是一个键值为Node指针的哈希表,不需要_nodes时,需要释放其中指针内存,操作如下。
for (auto it = _nodes.begin(); it != _nodes.end();)
{
if (it->second == NULL) continue; // 判断指针不为空,防止重复delete
delete it->second;
it->second = NULL; // 不管什么时候delete指针后都最好将其指向空指针,防止误用该指针或地址块
it = _nodes.erase(it); // erase返回当前迭代器的下一个指针
}