智能指针类的哈希函数作为无序映射的键



因此,我有一个指针包装类,它只存储一个指针,并且我需要将该类实例用作无序映射中的键。我目前有一个类似的设置,通过重写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;
}

相关内容

  • 没有找到相关文章

最新更新