2012-03-24 78 views
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; 
    } 
}; 

回答

3

一種方法是創建結構指針抱到雙打的順序:

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 ::向量:

unordered_map<vector<double>, vector<double>> cache; 

如果你知道編譯時就可以有多大使用的std ::數組:

unordered_map<array<double, N>, array<double, N>> cache; 

在這兩種情況下,默認哈希函數將值作爲你想要的工作,而你沒有NE編輯定義一個自定義的。

+0

我使用的是雙數組,因爲它是一個對這些對象進行大量操作的科學應用程序,double []具有比stl :: vector少得多的內存和計算開銷。我可以通過在它們之間不斷轉換來實現散列,但這顯然很昂貴。 – fairidox 2012-03-24 03:28:09

+0

除了兩個size_t計數(一個用於容量,一個用於大小),幾乎沒有開銷 - 但爲什麼不能使用std :: array? N的可能值是什麼?你能否讓N成爲你班級的模板參數?如果是這樣,你可以將它傳遞給std :: array。 – 2012-03-24 03:33:27

+0

N介於1到100之間,涉及的開銷與操縱長雙字符串有關。也就是說,我有一個長度爲1000萬的double []數組,我隨機抽取大小在1到100之間的數組,我需要計算各種統計數據。我或許可以用來代替它,但是更容易傳遞一個&array [k],而不是構造一個迭代器,在所述迭代器上循環構造一個新的,然後傳遞該矢量 – fairidox 2012-03-24 03:39:59