当我使用map< array<int,FIXEDSIZE>, int>
时,我的代码运行正常,但在使用unordered_map< array<int,FIXEDSIZE>, int>
时则无效。
它创建了大量错误列表,因此我不知道错误是什么。像&#34;价值&#34;不是会员,或者&#34;不匹配运营商[]&#34;等等。
这就是我使用我的地图(我将其命名为cache
)的方式:
if (cache.find(key) != cache.end()) return cache[key];
和
cache[key] = valueToMemoize;
答案 0 :(得分:0)
您需要定义自定义哈希对象,如下所示:
template<typename T, std::size_t N>
class arrayHash {
public:
std::size_t operator()(std::array<T, N> const &arr) const {
std::size_t sum(0);
for(auto &&i : arr) sum += std::hash<T>()(i);
return sum;
}
};
然后将您的unordered_map
定义为:
std::unordered_map<std::array<int, FIXEDSIZE>, int, arrayHash<int, FIXEDSIZE>> umap;
答案 1 :(得分:0)
这基本上是boost::hash_combine
归结为:
void hash_combine(std::size_t& seed, std::size_t value) {
seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
容器的简单哈希 - 使用std::hash
哈希所有元素,然后将它们组合起来。
struct container_hasher {
template<class T>
std::size_t operator()(const T& c) const {
std::size_t seed = 0;
for(const auto& elem : c) {
hash_combine(seed, std::hash<typename T::value_type>()(elem));
}
return seed;
}
};
使用:
std::unordered_map<std::array<int, 10>, int, container_hasher> my_map;
为了更便宜的查找,请执行
auto r = cache.find(key);
if(r != cache.end()) return r->second;
对于std::map
,您可能希望使用lower_bound
来帮助稍后插入:
auto lb = cache.lower_bound(key);
if(lb != cache.end() && lb->first == key) return lb->second;
cache.emplace_hint(lb, key, valueToMemoize);