如何使用固定数组和int的无序映射

How to use an unordered_map of fixed array and int?

本文关键字:int 无序 映射 数组 何使用      更新时间:2023-10-16

当我使用map< array<int,FIXEDSIZE>, int>时,我的代码工作得很好,但当我使用unordered_map< array<int,FIXEDSIZE>, int>时就不行了。

它创建了一个庞大的错误列表,所以我真的不知道出了什么问题。像"value"不是成员,或者"与operator[]不匹配"等

这就是我如何使用我的地图(我将其命名为cache):

if (cache.find(key) != cache.end()) return cache[key];

cache[key] = valueToMemoize;

这基本上就是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);

您需要定义自定义哈希对象,如下所示:

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;

实时演示