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

3 番目のテンプレート引数はハッシュ ファンクターです。比較ファンクターは4 番目のテンプレート引数です。したがって、次のものが必要です。

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

そして、あなたはまだ書く必要がありますHASH_HASH

(インスピレーションを得るために Boost の実装を参照することをお勧めしますhash_range。) また、ベクトルの等価性は既に定義されており (そして、あなたのバージョンよりも効率的)、自己記述コードを必要としないことに注意してください。

于 2013-03-19T10:22:45.913 に答える
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;
}
于 2013-03-19T10:22:01.277 に答える