如何使用固定数组和int的unordered_map?

时间:2015-11-27 22:07:53

标签: c++ arrays dictionary unordered-map

当我使用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;

2 个答案:

答案 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;

Live Demo

答案 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);