2012-06-05 66 views
0
#include <ext/hash_map> 

using namespace std; 

class hash_t : public __gnu_cxx::hash_map<const char*, list<time_t> > { }; 
hash_t hash; 

... 

我在使用這個hash_map時遇到了一些問題。作爲鍵的const char * im始終是一個長度爲12的數字,格式爲58412xxxxxxx。我知道有483809個不同的數字,因此在插入所有內容後應該是hash_map的大小,但我只能獲得193個條目。hash_map不工作

hash_t::iterator it = hash.find(origen.c_str()); 
if (it != hash.end()) { //Found 

    x++; 
    (*it).second.push_front(fecha);   
} 
else { //Not found 

    y++; 
    list<time_t> lista(1, fecha); 
    hash.insert(make_pair(origen.c_str(), lista));   
} 

相同的程序工作完全使用Python字典(我得到的條目正確數量的),但甚至還沒有接近使用C++。是否有可能是因爲每個鍵都以58412開頭(實際上幾乎每個鍵都是,但不是全部都是這樣,這就是我不想砍掉這5個字符的原因),是否會發生很多碰撞?

+0

我們不再是Python了,Toto。 –

+0

改變了幾行,並讓它與tr1 :: unordered_map – Alex

回答

4

const char*對於一個鍵是不好的,因爲你現在有指針比較而不是字符串比較(你也許有懸掛指針,返回值c_str()不能長期使用)。

改爲使用hash_map<std::string, list<time_t> >

+0

一起工作而且什麼是一個好鑰匙?如果我使用boost :: unordered_map,普通字符串是否可以正常工作? – Alex

+0

當我嘗試直接使用字符串時,它不會編譯。這就是我爲const char * – Alex

+2

@Alex去的原因所以oncoe它不編譯你選擇一個完全不同的方法,而不是使它編譯?爲什麼不編譯?它可以是沒有適當的'std :: string'哈希函數? –

1

如果你的密鑰是char*,你不是比較字符串,而是指針,這使得你的hashmap的工作方式與你期望的不同。考慮使用const std::string作爲密鑰,因此它們使用字典順序進行比較

+0

好的。我知道了。有關如何解決此問題的任何建議? – Alex

+0

當我使用字符串作爲鍵時,它不會編譯。這就是我第一次去char *的原因 – Alex

+0

看看[這些](http://forums.devshed.com/c-programming-42/tip-about-stl-hash-map-and-string-55093 .html)[鏈接](http://gcc.gnu.org/ml/libstdc++/2002-04/msg00107.html)爲什麼'hash_map <>'不能與'string's一起工作,以及如何解決問題 – Attila