c++ - 哈希函数错误,c++

标签 c++ hash unordered-set

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

#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实例化成员变量。同时更改返回类型 voidint在 main 上,我建议返回 0 或 EXIT_SUCCESS来自 <cstdlib>在 main 的末尾。

关于c++ - 哈希函数错误,c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29660702/

相关文章:

c++ - C++中的合并排序程序不起作用

arrays - 复制数组哈希的前 N ​​个键和值

ruby - 如何在 Ruby 1.9 中只获取有序哈希的一个子集?

java - 哈希整个对象而不先转换为 byte[]

c++ - 是否有标准机制来检索 C 字符串的哈希值?

c++ - 使用 lambda 做定义哈希函数抛出异常

c++ - 为什么 unordered_set 操作像计数和删除返回一个 size_type?

c++ - 前/后插入器就位

c++ - 为什么 C++ ofstream write() 方法会修改我的原始数据?

c++ - MSVC 使用 constexpr 从可变参数模板方法中的基本模板参数中吞下 const if