哈希函数错误,c++

Hash function errors, c++

这是我编写的带有散列函数的简单示例 class。函数可能不是最有效的函数,但哈希函数的质量目前与我无关。

#include<iostream>
#include<unordered_set>

using namespace std;

class Class{
private:
    int num;
public:
    Class(int n){num=n;}
    Class(){num=0;}
    int getNum(){return num;}

    friend bool operator==(const Class &k1, const Class &k2);

};

bool operator==(const Class &k1, const Class &k2){
    return(k1.num == k2.num);
}

namespace std {
  template <>
  struct hash<Class>{

    size_t operator()(const Class & c) const
    {
        return(31+c.getNum()*7);
    }
  };
}

void main(){

    unordered_set<Class> set;
    set.insert(Class(5));
    set.insert(Class(55));
    set.insert(Class(4));
    set.insert(Class(123));
    set.insert(Class(11));

    for(unordered_set<Class>::iterator it = set.begin(); it!=set.end(); it++)
        cout<<it->getNum()<< endl;
}

这在 Class 的所有字段都是 public 时工作正常,但是在 creturn(31+c.getNum()*7); 的散列函数中出现错误,因为我无法调用 getNum()函数。我不知道如果在 size_t operator()(const Class & c) const 行我删除了 const,那么对象 c 不是 const 是否有任何问题?

另外,最后一行cout<<it->getNum()<< endl,访问getNum()函数时出错。我不知道如何遍历 unordered_set set 并打印 num.

您的运算符采用 const class 但调用非常量成员函数。要解决您的问题,请将 getNum 声明为 const,因为它不会修改 class.

class Class{
private:
    int num;
public:
    Class(int n) : num(n) {}
    Class() : num(0) {}
    int getNum() const { return num;}

    friend bool operator==(const Class &k1, const Class &k2);

};

在上面的例子中还注意到我使用了member initializer lists来实例化成员变量。还要在 main 上将 return 类型从 void 更改为 int,我建议在 returning 0 或 EXIT_SUCCESS 结束时从 <cstdlib>主.