2013-03-27 144 views
1

我想創建一個具有char*作爲關鍵字和vector<int>作爲value的unordered_map。我從前面的問題中得知,STL沒有提供char*的散列函數。C++:爲什麼我的散列函數爲unordered_map <char *,向量<int>>工作?

我把第一個實現從這個網站:http://www.cse.yorku.ca/~oz/hash.html

因此,有我的main.cpp文件我插入下面的代碼:

namespace std 
{ 
    template<> 
    struct hash<char*>: public std::unary_function<char *, size_t> 
    { 
     size_t operator()(char * str) const{ 
     size_t hash = 5381; 
     int c; 

     while(c = *str++) 
     hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 

     return hash; 

    } 
    }; 
} 

然後,我創建了一個unordered_map變量:

std::unordered_map<char *, vector<int>> test; 

但是,如果我這樣插入值「temp」兩次:

std::unordered_map<char *, vector<int>> test; 
char *t1 = new char[5]; 
strcpy(t1, "temp"); 
char *t2 = new char[5]; 
strcpy(t2, "temp"); 
vector<int>& ptr = test[t1]; 
ptr.push_back(0); 
vector<int>& ptr2 = test[t2]; 
ptr2.push_back(1); 

最終地圖,而不是具有大小兩者的矢量,其中該矢量的每個元素是一個「TEMP」鍵0或1它有一個名爲「溫度」,並在每個鍵的矢量的兩個鍵尺寸1.

這裏是詳細的圖片: enter image description here

我怎樣才能避免這種情況發生?預先感謝你

+0

爲什麼不使用'std :: string'?你的哈希表會泄漏內存。 – jxh 2013-03-27 18:03:09

+0

使用STD某種原因:: string的給了我非常緩慢的執行時間 我想看看是否有什麼就用字符*雖然我有一種感覺,什麼都不會改變... – ksm001 2013-03-27 18:05:49

回答

3

這不是一個哈希函數的問題,這是一個問題與char*的平等。你依靠指針比較,你可以從調試器看到變量,各種「臨時」文字的指針有不同的位置,因此不相等。

您需要定義一個實際進行字符串比較的等式仿函數,並將其與unordered_map一起使用。

或者,而不是使用char*作爲您的密鑰,請使用std::string,並完全避免此問題。

+0

感謝你改變,但是如果我們談論性能,與char *相比,由於構造函數/析構函數的原因,不會使用字符串給出錯誤的執行時間? – ksm001 2013-03-27 18:10:17

+2

@ ksm001:哈希表性能取決於插入,碰撞,檢索和刪除的組合。通常的假設是,檢索量大大超過了清除量。無論如何,你的實現是作弊的,因爲你永遠不會釋放你的記憶。 – jxh 2013-03-27 18:14:43

相關問題