Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自定义哈希/equals函数与无序_映射不匹配_C++_Hash_Equals_Unordered Map - Fatal编程技术网

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
添加到指针指向的节点,因此它稍微有点符合语义。