这是我编写的带有散列函数的简单示例类。函数可能不是最有效的函数,但哈希函数的质量目前与我无关。
#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
的所有字段时,这工作正常是公开的,但错误出现在 return(31+c.getNum()*7);
的散列函数中在 c
, 因为我不能调用 getNum()
功能。不知道在size_t operator()(const Class & c) const
行有没有问题我删除了 const,所以对象 c 不是 const?
另外,在最后一行,cout<<it->getNum()<< endl
,访问时出错getNum()
功能。我不知道如何遍历 unordered_set set
并打印数字。
最佳答案
您的接线员需要一个 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);
};
在上面的示例中,还请注意我使用了 member initializer lists实例化成员变量。同时更改返回类型 void
至 int
在 main 上,我建议返回 0 或 EXIT_SUCCESS
来自 <cstdlib>
在 main 的末尾。
关于c++ - 哈希函数错误,c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29660702/