如何使用固定数组和int的无序映射
How to use an unordered_map of fixed array and int?
当我使用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;
实时演示
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 如何写向量的无序向量集,即unordered_set<向量<向量<int>>集合?
- C++:使用一对(cpp_int,int)整数作为无序映射中的键(其中cpp_int是boost多精度整数)
- 声明一个无符号int和一个数组的无序映射(将具有不同的大小)
- 如何使用固定数组和int的无序映射
- C++11 无序 map<int, Mytype* 的有序迭代器>