问题描述
我想使用结构Item
作为unordered_map中的键
我实现了哈希和相等操作的结构。
但是我有一个错误
hashtable_policy.h:1384:16:错误:对“(const ItemHash)(const Item&)”的调用不匹配 solution.cpp:28:12:注意:候选者:'size_t ItemHash :: operator()(Item)' 32 | size_t operator()(项目项){ solution.cpp:28:12:注意:将“ const ItemHash *”作为“ this”参数传递会舍弃限定符
我的代码
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;
}
解决方法
您需要const
符合ItemHash::operator()(Item)
的资格,即
struct ItemHash {
size_t operator()(Item item) const
// ^^^^ here
{
// as before...
}
请注意,正如@JeJo在评论中指出的,您需要对ItemEqual
使用相同的修复程序。