2013-03-19 35 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的相等性已經被定義(並且比你的版本更有效),並且不應該要求自寫的代碼。