因此,我有一个指针包装类,它只存储一个指针,并且我需要将该类实例用作无序映射中的键。我目前有一个类似的设置,通过重写bool operator<
将该指针包装实例作为std::map
的键,但对于无序映射设置,我需要重写另外两个运算符==
和()
。我已经了解了==
运算符的实现方式,但不确定()
运算符的实现。在这种情况下,我应该做什么样的散列实现设置?我已经检查了一些地方,大多数示例都涉及非指针情况,它们使用两个Key项并为每个项形成hash,并对它们进行()
实现的比较。
template <class T>
class PointerWrap{
public:
T* pointer;
bool operator<(const PointerWrap& other)const{return *pointer < *other.pointer;}
bool operator==(const PointerWrap& other)const{return *pointer == *other.pointer;}
//size_t operator()(const PointerWrap& other)const{return (*pointer)(*other.pointer);}
};
class VarType{
bool operator<(const VarType& other)const{return this < &other;}
bool operator==(const VarType& other)const{return this == &other;}
size_t operator()(const VarType& other)(.?.?.}
};
//Desired setup.
std::unordered_map<PointerWrap<VarType>,Value> mymap;
由于您似乎只需要一个哈希函数来在无序映射中使用PointerWrappers,因此标准库中的哈希函数应该可以很好地为您服务。(但这些不是加密安全的哈希函数,所以不要将它们用于其他用途(。这里有一些代码来展示如何做到这一点:
#include <unordered_map>
#include <iostream>
template <class T>
class PointerWrap {
public:
T* pointer;
bool operator<(const PointerWrap& other)const { return *pointer < *other.pointer; }
bool operator==(const PointerWrap& other)const { return *pointer == *other.pointer; }
size_t operator()(const PointerWrap& other) const {return (*pointer)(*other.pointer);}
};
class VarType {
public: // PointerWrap has no access to these operators without a public access specifier
bool operator<(const VarType& other)const { return this < &other; }
bool operator==(const VarType& other)const { return this == &other; }
// Pointless to hash a object without any data
std::size_t operator()(const VarType& other)const {
return 0;
}
};
// Specialization of std::hash for PointerWrap<T>
template<typename T>
class std::hash<PointerWrap<T>> {
public:
size_t operator()(PointerWrap<T> v) const{
return std::hash<T*>()(v.pointer);
}
};
int main() {
// your desired setup compiles.
std::unordered_map<PointerWrap<VarType>, int> mymap;
PointerWrap<VarType> a;
mymap[a] = 5;
std::cout << mymap[a] << std::endl;
return 0;
}