0
struct HASH_CMP {
    bool operator()(vector<int> V, vector<int> W) const {
        for(int i = 0; i < 10; i++)
            if(V[i] != W[i]) return false;
        return true;
    }
};
hash_map< std::vector<int>, int, HASH_CMP > H;

long long inHash(const vector<int> &V) {
    if(H.find(V) == H.end()) return -1; //this line
    return H[V];
}

鉴于上面的比较类,我已经声明了以下哈希,并且在提到的行中收到错误消息:

呼叫不匹配 '(const HASH_CMP) (const std::vector<int, std::allocator<int> >&)

我需要一些帮助来修复此代码。

4

2 回答 2

2

第三个模板参数是散列函子。比较函子是第四个模板参数。因此你需要:

hash_map<std::vector<int>, int, HASH_HASH, HASH_CMP>

而且您仍然需要编写HASH_HASH.

(我建议您查看 Boost 的hash_range实现以获得灵感。)还要注意向量的相等性已经定义(并且比您的版本更有效)并且不需要自己编写代码。

于 2013-03-19T10:22:45.913 回答
1

正如错误告诉您的那样,您需要一个接受 aconst std::vector<int>&并返回 a的散列函数size_t。要将某些内容放入哈希映射中,必须有某种方法对其进行哈希处理。

这将起作用:

size_t operator()(const vector<int>& vec)
{
    size_t v = 0;
    for (vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it)
        v = (v ^ *it) * 0x9e3779b9;
    return v;
}
于 2013-03-19T10:22:01.277 回答