2013-03-19 77 views
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]; 
} 

我已经宣布了下述散,给上述比较级和我收到该行错误提到说:的hash_map < vector<int>,使用int>的错误,当查找功能

敌不过调用'(const HASH_CMP) (const std::vector<int, std::allocator<int> >&)

我需要一些帮助来解决这段代码。

+2

你从来没有写过[哈希函数](http://www.sgi.com/tech/stl/HashFunction.html)(返回一个'size_t')。如果您有办法对其进行哈希处理,您只能将其放在哈希映射中。 – 2013-03-19 10:20:04

+2

我相信你希望通过引用'operator()'中的'const'来接受你的向量。' – 2013-03-19 10:20:08

+0

顺便说一句,对于'std :: vector',有一个相等比较运算符=='。它与你的完全不一样,但它可能是有用的。 – juanchopanza 2013-03-19 10:55:55

回答

1

由于错误告诉你,你需要一个散列函数,它需要一个const std::vector<int>&并返回一个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; 
} 
+0

考虑到我正在创建一个返回size_t的函数,hash_map将如何处理碰撞? – user2185983 2013-03-19 10:34:00

+0

它会将碰撞放在同一个桶中,并且必须逐个元素进行比较。 – 2013-03-19 11:25:06

2

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

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

而且您仍然需要编写HASH_HASH。 (我建议你看看Boost的hash_range实现的启发。)另外请注意,vector的相等性已经被定义(并且比你的版本更有效),并且不应该要求自写的代码。