哈希函数错误,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 时工作正常,但是在 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
并打印 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>
主.
这是我编写的带有散列函数的简单示例 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 时工作正常,但是在 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
并打印 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>
主.