哈希函数错误,c++

Hash function errors, c++

本文关键字:c++ 错误 函数 哈希      更新时间:2023-10-16

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

#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的所有字段都是公共的时,这工作正常,但是错误出现在c return(31+c.getNum()*7);哈希函数中,因为我无法调用getNum()函数。我不知道如果我在行size_t operator()(const Class & c) const删除 const,是否有任何问题,所以对象 c 不是 const?

此外,在最后一行中, cout<<it->getNum()<< endl ,访问getNum()函数时出错。我不知道如何迭代unordered_set set并打印数字。

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

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);
};

在上面的示例中,还注意到我使用了成员初始值设定项列表来实例化成员变量。此外,在 main 上将返回类型从 void 更改为 int,我建议在 main 末尾从 <cstdlib> 返回 0 或 EXIT_SUCCESS