在doubles数组上使用unordered_map
Using unordered_map on array of doubles
我的主数据对象是一个长度为双倍的数组,它取决于我的类的特定实例化。我想构建一个非常简单的哈希表来存储/检索这些对象,我们可以假设这些数字是以没有数字错误的方式生成的。
int main() {
std::tr1::unordered_map<double*, double*> cache;
double x1[] = { 1.0, 3.14 };
double x2[] = { 1.0, 3.14 };
cache[x1] = x1;
std::cout << "x1: " << cache.count(x1) << std::endl;
std::cout << "x2: " << cache.count(x2) << std::endl;
return 0;
}
上面显然只比较了指针,给出了输出:
> ./tmp
x1: 1
x2: 0
当我真的想看:
> ./tmp
x1: 1
x2: 1
当数组的大小在编译时固定时,如何创建自定义哈希和等式函数是非常清楚的,但我不知道如何创建依赖于特定实例化的自定义函数。。。我在下面创建了一个类,但我不确定它是否有用,也不确定如何使用它。
class Hash_double_vec {
public:
int dim;
Hash_double_vec(int d) { dim = d; }
size_t operator()(const double *x) const{
std::tr1::hash<double> hash_fn;
size_t r = hash_fn(x[0]);
for(int i=1;i<dim;i++) r ^= hash_fn(x[i]);
return r;
}
bool operator()(const double *x, const double *y) const{
for(int i=1;i<dim;i++) if (fabs(x[i]-y[i]) > 1e-10) return false;
return true;
}
};
一种方法是创建一个结构来保存指向双打序列的指针:
struct DoubleRegion
{
double* p;
size_t size;
};
bool operator==(DoubleRegion a, DoubleRegion b)
{
return a.size == b.size && memcmp(a.p, b.p, a.size) == 0;
}
size_t hash(DoubleRegion dr)
{
size_t h = 0;
for (double* p = dr.p; p != dr.p + dr.size; ++p)
h ^= hash(*p);
return h;
}
然后使用它:
unordered_map<DoubleRegion, DoubleRegion> cache;
当然,确保备份内存的生存期是DoubleRegion生存期的超集是您的问题。
旧答案:
如果直到运行时才知道键和值的大小,请使用std::vector:
unordered_map<vector<double>, vector<double>> cache;
如果您在编译时知道可以使用std::array:的大小
unordered_map<array<double, N>, array<double, N>> cache;
在这两种情况下,默认哈希函数都将根据您的需要按值工作,并且您不需要定义自定义哈希函数。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- unordered map -在c++ std::unordered_map中预分配桶