当前位置: 首页 > 知识库问答 >
问题:

自定义结构作为无序_映射中的键

薛承志
2023-03-14

我想使用结构Item作为关键unordered_map我实现了散列和相等操作的结构。但是我有一个错误

hashtable_策略。h:1384:16:错误:对“(const ItemHash)(const Item)的调用不匹配

我怎样才能纠正错误?

我的密码

vector<int> get_key(const string& s) {
    vector<int> res(26, 0);
    for (int i = 0; i < s.size(); ++i) {
        int pos = s[i] - 'a';
        res[pos]++;
    }
    return res;
}

struct Item {
    vector<int> v;
    
    Item(const vector<int>& vec) : v(vec) {}
    bool operator==(Item other) {
        if (v.size() != other.v.size()) {
            return false;
        }
        for (int i = 0; i < v.size(); ++i) {
            if (v[i] != other.v[i]) {
                return false;
            }
        }
        return true;
    }
};

struct ItemHash {
    size_t operator()(Item item) {
        auto vec = item.v;
        size_t seed = vec.size();
        for(auto& i : vec) {
            seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2);
        }
        return seed;
    }
};

struct ItemEqual {
    bool operator()(Item item1, Item item2) {
        return item1 == item2;
    }  
};

vector<vector<int> > Solution::anagrams(const vector<string> &A) {
    vector<vector<int>> res;
    unordered_map<Item, vector<int>, ItemHash, ItemEqual> hash; // hash_key, vector of indexes
    for (int i = 0; i < A.size(); ++i) {
        Item item = Item(get_key(A[i]));
        hash[item].push_back(i);
    }
    for (const auto& i : hash) {
        res.push_back(i.second);
    }
    return res;
}

共有1个答案

强阳曜
2023-03-14

您需要const-限定ItemHash::operator()(Item),即。,

struct ItemHash {
    size_t operator()(Item item) const
    //                            ^^^^ here
    {
       // as before...
    }

请注意,正如@JeJo在评论中指出的,您需要对ItemEqual进行相同的修复。

 类似资料:
  • 我试图使用一个自定义类作为的键,如下所示: 但是,g给出了以下错误: 我想,我需要告诉C如何散列类,然而,我不太确定如何做。我怎样才能完成这些任务?

  • 如何使Gson正确序列化我的密钥?

  • 我一直在研究GraphQL作为我的一些RESTAPI的替代品,虽然我认为我已经对基本知识了如指掌,就像我目前看到的大多数内容一样,但似乎缺少了一个重要的功能。 比如说,我有一系列这样的物品: 应用程序需要所有这些对象的映射,按ID索引: 我写过的每个API都能够以这样的格式返回结果,但我正在努力寻找一种用GraphQL来做到这一点的方法。我一直在运行第101个问题,但这更多地涉及未知模式。就我而言

  • 注意:我的jar是一个用Warbler编译成jar的jruby文件。

  • 以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我发现MapStruct的方式。 因此,我试图构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我想要: 在mapper实现中,我会有如下内容: 如果有人能帮我做到这一点,我将不胜感激,这将节省我很多时间。 提前谢谢。

  • 我试图在Go中创建一个泛型方法,该方法将使用来自< code > map[string]interface { } 的数据填充< code>struct。例如,方法签名和用法可能如下所示: 我知道使用JSON作为中介可以做到这一点;有没有其他更有效的方法?