gpt4 book ai didi

c++ - 在 double 组上使用 unordered_map

转载 作者:行者123 更新时间:2023-11-30 03:02:50 26 4
gpt4 key购买 nike

我的主要数据对象是一个 double 组,其长度取决于我的类的特定实例化。我想构建一个非常简单的哈希表来存储/检索这些对象,我们可以假设这些数字是以没有数字错误的方式生成的。

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;
}
};

最佳答案

一种方法是创建结构来保存指向 double 序列的指针:

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;

在这两种情况下,默认的散列函数都将根据您的需要按值工作,您无需定义自定义散列函数。

关于c++ - 在 double 组上使用 unordered_map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9848868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com