首页 > 解决方案 > unordered_set 通过 lambdas 自定义哈希

问题描述

我可以通过函子实现自定义哈希函数没问题。但是,当尝试编译此代码时

class Student {
public:
    string fname;
    string lname;
    Student(string f, string l) : fname(f), lname(l) {}
};

int main()
{
    Student a("John", "Doe");
    auto StudentHash = [](const Student& obj) -> const size_t 
         {return (std::hash<string>()(obj.fname) ^ std::hash<string>()(obj.lname)); };
    auto StudentEqual = [](const Student& lhs, const Student& rhs) -> const bool 
         {return (lhs.fname == rhs.fname && lhs.lname == rhs.lname);};
    unordered_set<Student, decltype(StudentHash), decltype(StudentEqual)> st;
    st.insert(a);
}

我收到以下错误:

Error   C2280   'main::<lambda_a8a8645443a5445869be61b46baaf9d3>::<lambda_a8a8645443a5445869be61b46baaf9d3>(void)': attempting to reference a deleted function

为什么会这样?

标签: c++hashvisual-studio-2017unordered-set

解决方案


您需要将HashKeyEqual对象提供给 的构造函数unordered_set,如下所示:

unordered_set<Student, decltype(StudentHash), decltype(StudentEqual)> st(0, StudentHash, StudentEqual);

这是一个演示


推荐阅读