Unordered_map和带有值语义的指针

unordered_map and pointers with value semantics

本文关键字:语义 指针 map Unordered      更新时间:2023-10-16

我定义了一个类型Term,它可以通过指针访问,但具有值语义;如果两个不同的Term对象具有相同的内容,那么它们在逻辑上是相等的。我需要使用它们作为映射键。

第一次尝试可能是unordered_map<Term*, int>,但这本身并不能获得值语义。需要自定义哈希和相等比较函数。(出于多种原因,我希望全局定义这些参数,而不是在每种情况下都将它们作为额外的模板参数提供。)

自定义哈希函数可以定义为

namespace std {
template <>
struct hash<Term*> ...

但是unordered_map==比较键,你不能在内置类型上定义自定义操作符,并且所有指针都是内置类型。

我可以定义一个仅保存Term*的包装器类,并将其用作键。有没有更简单的解决办法?

如果你看看unordered_map:

的定义
template<
    class Key,
    class T,
    class Hash = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Allocator = std::allocator< std::pair<const Key, T> >
> class unordered_map;

可以看到,您可以将用于比较的自定义操作符定义为第四个模板参数。在您的情况下,您只需在unordered_map创建时提供一次,而不必"在每种情况下都将它们作为额外的模板参数提供":

struct custom_operator {
    bool operator()(Term* lhs, Term* rhs) const { ... }
};

,然后用作:

std::unordered_map< Term*, int
                  , std::hash<Term*>
                  , custom_operator> map;

在任何情况下,我都强烈建议不要使用指针作为散列映射的键。如果逻辑上您希望Term作为密钥,则应该只使用std::unordered_map<Term, int>