C++ 自定义哈希/equals函数与无序_映射不匹配
我有以下代码 文件C++ 自定义哈希/equals函数与无序_映射不匹配,c++,hash,equals,unordered-map,C++,Hash,Equals,Unordered Map,我有以下代码 文件Ant.h class hashing_func { public: unsigned long operator()(const Node& key) const { unsigned long hash; hash = key.GetId(); return hash; } }; class key_equal_fn { public:
Ant.h
class hashing_func {
public:
unsigned long operator()(const Node& key) const {
unsigned long hash;
hash = key.GetId();
return hash;
}
};
class key_equal_fn {
public:
bool operator()(const Node& t1, const Node& t2) const {
return (t1.GetId() == t2.GetId());
}
};
class Ant {
private:
std :: unordered_map <Node*, int, hashing_func, key_equal_fn> nodemap;
};
显然,我的映射包含节点*
(节点指针)作为键,并且当前需要
long unsigned int hashing_func :: operator() ( const Node& const)
我将如何解决这个问题(将哈希和相等函数转换为接受节点指针)?非常感谢您的帮助。问题是您的键是
节点*
,但您的哈希和相等比较器是用于常量节点&
。您需要使用节点
键,或为节点*
编写函子:
std :: unordered_map <Node, int, hashing_func, key_equal_fn> nodemap;
等等。问题是您的键是
节点*
,但您的哈希和相等比较器是用于常量节点&
。您需要使用节点
键,或为节点*
编写函子:
std :: unordered_map <Node, int, hashing_func, key_equal_fn> nodemap;
等等。对于散列,签名应该是
unsigned long operator()(Node* key) const;
bool operator()(Node* t1, Node* t2) const;
作为比较,它应该是
unsigned long operator()(Node* key) const;
bool operator()(Node* t1, Node* t2) const;
对于散列,签名应该是
unsigned long operator()(Node* key) const;
bool operator()(Node* t1, Node* t2) const;
作为比较,它应该是
unsigned long operator()(Node* key) const;
bool operator()(Node* t1, Node* t2) const;
const节点*
不起作用,指针是const,不是它所指向的。糟糕的是,我在测试GetId()
时忘记了另一个const
。你说得对,它会起作用的+1我只是想,Node*const&key
也可以工作,而不是const Node*key
。你能解释一下为什么会这样吗?@bas可能是因为GetId()
没有被标记为const
方法(我敢打赌应该是这样)const节点*
是指向const
节点
的非常量指针,这意味着您无法修改节点
Node*const&
是对指向非const
节点的const
指针的引用,这意味着您通过引用传递指针,但无法修改它,但可以修改它所指向的节点。修改其参数的哈希和逻辑比较不是一个好主意。@bas它传递对无序映射中存储的指针的引用。事实上,这就是您需要的通用模式:KeyType const&
-在您的示例中,KeyType
是Node*
。相反,使用Node*
更短,而且在这种情况下没有任何缺点,const Node*
实际上是将const
添加到指针所指向的节点,因此它稍微有点像语义。const Node*
不起作用,指针是const,而不是它所指向的。我的错,我在测试GetId()
时忘记了另一个const
。你说得对,它会起作用的+1我只是想,Node*const&key
也可以工作,而不是const Node*key
。你能解释一下为什么会这样吗?@bas可能是因为GetId()
没有被标记为const
方法(我敢打赌应该是这样)const节点*
是指向const
节点
的非常量指针,这意味着您无法修改节点
Node*const&
是对指向非const
节点的const
指针的引用,这意味着您通过引用传递指针,但无法修改它,但可以修改它所指向的节点。修改其参数的哈希和逻辑比较不是一个好主意。@bas它传递对无序映射中存储的指针的引用。事实上,这就是您需要的通用模式:KeyType const&
-在您的示例中,KeyType
是Node*
。相反,使用Node*
更短,并且在这种情况下没有任何缺点,const Node*
实际上是将const
添加到指针指向的节点,因此它稍微有点符合语义。