Unordered_map和带有值语义的指针
unordered_map and pointers with value semantics
我定义了一个类型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>
。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- c++在使用指针时移动语义
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 如何包装多级原始指针以赋予其容器语义
- 智能指针移动语义我不清楚
- 如何使用不同的指针算术语义
- 基于指针容器循环的范围内的值语义
- 为什么我们应该使用带有唯一指针的 std::move 语义?
- 在封装指针的类中,移动语义无意中被复制构造函数取代
- 移动语义是否只是一个浅层副本并将其他人的指针设置为 null?
- 明智的指针所有权语义和平等
- C++ 中不同指针语法之间的语义差异
- C/C++ 函数中的引用、指针或值语义
- 传递指向常量指针的指针到字节数组的语义冲突
- 文件输入和指针所有权语义
- 唯一指针xvalue语义?为什么lambda f2的行为与lambda f1不同
- 复制C++唯一指针的语义
- C++11 智能指针语义
- 传递函数指针 - 语义