【问题标题】:hash_map< vector<int>, int> error when using find functionhash_map<vector<int>, int> 使用 find 函数时出错
【发布时间】:2013-03-07 23:08:05
【问题描述】:
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&lt;int, std::allocator&lt;int&gt; &gt;&amp;) 的调用不匹配

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

【问题讨论】:

  • 你从未写过hashing function(返回size_t)。如果你有办法散列它,你只能把一些东西放在散列图中。
  • 我相信您想通过在operator () 中引用const 来接受您的向量
  • 顺便说一句,operator==std::vector 存在相等比较。它和你的不完全一样,但它可能有用。

标签: c++ vector find hashmap


【解决方案1】:

正如错误告诉您的那样,您需要一个散列函数,它接受 const std::vector&lt;int&gt;&amp; 并返回 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;
}

【讨论】:

  • 考虑到我正在创建一个返回 size_t 的函数,hash_map 将如何处理冲突?
  • 它将碰撞放在同一个桶中,并且必须逐个元素地比较事物。
【解决方案2】:

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

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

而且你还需要写HASH_HASH

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多