使用自定义类型作为键的C+无序映射

使用自定义类型作为键的C+无序映射

我试图使用自定义类作为unordered_map,如下所示:

#include <iostream>#include <algorithm>#include <unordered_map>using namespace std;class node;class Solution;class Node {public:
    int a;
    int b; 
    int c;
    Node(){}
    Node(vector<int> v) {
        sort(v.begin(), v.end());
        a = v[0];       
        b = v[1];       
        c = v[2];       
    }

    bool operator==(Node i) {
        if ( i.a==this->a && i.b==this->b &&i.c==this->c ) {
            return true;
        } else {
            return false;
        }
    }};int main() {
    unordered_map<Node, int> m;    

    vector<int> v;
    v.push_back(3);
    v.push_back(8);
    v.push_back(9);
    Node n(v);

    m[n] = 0;

    return 0;}
我想,我需要告诉C+如何散列类Node然而,我不太清楚该如何做。我如何完成这些任务?


富国沪深
浏览 423回答 2
2回答

UYOU

我认为,日本给出了一个非常好的和详尽的回答..在看我的帖子之前,你一定要先看一看。不过,我想补充以下几点:控件的比较函数。unordered_map单独地,而不是使用相等的比较运算符(operator==)。例如,如果您想使用后者来比较两个成员的所有成员,这可能是有帮助的。Node对象之间,但只有一些特定成员作为unordered_map.您也可以使用Lambda表达式而不是定义散列和比较函数。总之,为了你Node类,代码可以编写如下:using&nbsp;h&nbsp;=&nbsp;std::hash<int>;auto&nbsp;hash&nbsp;=&nbsp;[](const&nbsp;Node&&nbsp;n){return&nbsp;((17&nbsp;*&nbsp;31&nbsp;+&nbsp;h()(n.a))&nbsp;*&nbsp;31&nbsp;+&nbsp;h()(n.b))&nbsp;*&nbsp;31&nbsp;+&nbsp;h()(n.c);}; auto&nbsp;equal&nbsp;=&nbsp;[](const&nbsp;Node&&nbsp;l,&nbsp;const&nbsp;Node&&nbsp;r){return&nbsp;l.a&nbsp;==&nbsp;r.a&nbsp;&&&nbsp;l.b&nbsp;==&nbsp;r.b&nbsp;&&&nbsp;l.c&nbsp;==&nbsp;r.c;};std: :unordered_map<Node,&nbsp;int,&nbsp;decltype(hash),&nbsp;decltype(equal)>&nbsp;m(8,&nbsp;hash,&nbsp;equal);注:我只是在jogoJapan的答案末尾重用了散列方法,但是您可以找到一个更通用的解决方案。这里(如果您不想使用Boost)。我的代码可能太小了。有关可读性稍强的版本,请参见Ideone的这段代码.
打开App,查看更多内容
随时随地看视频慕课网APP