1
我的主數據對象是一個長度爲雙精度的數組,它取決於我的類的特定實例。我想構造一個非常簡單的哈希表來存儲/檢索這些對象,並且我們可以假設數字是以沒有數字錯誤的方式生成的。在雙精度數組上使用unordered_map
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
這是很清楚如何創建自定義的散列和平等函數當數組的大小是固定在編譯時間,但我不知道如何使自定義函數依賴於特定的我nstantiation ...我在下面創建了一個類,但我不確定它是否有用,或者它如何使用。
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 []具有比stl :: vector少得多的內存和計算開銷。我可以通過在它們之間不斷轉換來實現散列,但這顯然很昂貴。 – fairidox 2012-03-24 03:28:09
除了兩個size_t計數(一個用於容量,一個用於大小),幾乎沒有開銷 - 但爲什麼不能使用std :: array? N的可能值是什麼?你能否讓N成爲你班級的模板參數?如果是這樣,你可以將它傳遞給std :: array。 – 2012-03-24 03:33:27
N介於1到100之間,涉及的開銷與操縱長雙字符串有關。也就是說,我有一個長度爲1000萬的double []數組,我隨機抽取大小在1到100之間的數組,我需要計算各種統計數據。我或許可以用來代替它,但是更容易傳遞一個&array [k],而不是構造一個迭代器,在所述迭代器上循環構造一個新的,然後傳遞該矢量 –
fairidox
2012-03-24 03:39:59