2009-10-29 76 views
3

這是我第一次製作散列表。我試圖將字符串(鍵)與類Strain的對象(數據)的指針相關聯。將對象插入散列表(C++)

// Simulation.h 
#include <ext/hash_map> 
using namespace __gnu_cxx; 

struct eqstr 
{ 
bool operator()(const char * s1, const char * s2) const 
    { 
    return strcmp(s1, s2) == 0; 
    } 
}; 

... 
hash_map< const char *, Strain *, hash< const char * >, struct eqstr > liveStrainTable; 

在Simulation.cpp文件,我嘗試初始化表:

string MRCA; 
for (int b = 0; b < SEQ_LENGTH; b++) { 
    int randBase = rgen.uniform(0,NUM_BASES); 
    MRCA.push_back(BASES[ randBase ]); 
} 
Strain * firstStrainPtr; 
firstStrainPtr = new Strain(idCtr, MRCA, NUM_STEPS); 
liveStrainTable[ MRCA ]= firstStrainPtr; 

我收到寫着「敵不過‘操作[]’中「((模擬的錯誤消息* )本) - >仿真:: liveStrainTable [MRCA]」「。我也嘗試以不同的方式使用「liveStrainTable.insert(...)」,但無濟於事。

真的會喜歡這方面的一些幫助。我很難理解適合SGI hash_map的語法,並且SGI reference幾乎沒有爲我澄清任何事情。謝謝。

回答

3

嘗試liveStrainTable[ MRCA.c_str() ]= firstStrainPtr;。它預計const char *作爲鍵值的類型,但MRCAstring類型。

另一種方式是改變liveStrainTable到:

hash_map< string, Strain *, hash<string>, eqstr > liveStrainTable; 
0

的的hash_map定義與爲const char *作爲密鑰類型和訪問時,您使用的std :: string的關鍵。這些是2種不同的類型,模板沒有爲第二種類型創建操作符,所以這是一個錯誤。使用std :: string作爲散列表定義或使用MRCA.c_str()

0

現在,你有一個類型不匹配。您正在通過MRCA(字符串),其中char const *預計。您可以使用c_str()從字符串中獲取char const *,或者(更好)更改散列表的定義以將字符串作爲其鍵類型。

2

其他人回答了你的直接問題,但我可以建議使用unordered_map代替 - 它將與STL的下一個版本一起提供,並且受所有主要編譯器支持。

+1

這是否有什麼優勢呢? – 2009-10-30 15:46:15

+2

不使用具有兩個前導下劃線的命名空間:) – 2009-10-30 16:19:35

1

hash_map不是STL的一部分。沒有爲散列提供實現,或者換句話說,默認情況下,hash_map不能散列字符串。你需要你自己的散列函數。牛逼

嘗試:

typedef struct { 
    size_t operator()(const string& str) const { 
    return __gnu_cxx::__stl_hash_string(str.c_str()); 
    } 
} strhash; 

hash_map< string, Strain *, strhash, eqstr > liveStrainTable; 
+0

**真棒!**謝謝。 「liveStrain [MRCA] = firstStrainPtr;」似乎工作 - 我現在將開始編寫所有其他操作。我不能等到hash_map/unordered_map是STL的一部分,並且可以處理字符串。 – Sarah 2009-10-30 16:35:40

+0

「我不能等到hash_map/unordered_map是STL的一部分」實際上它就是成爲標準庫的一部分。大部分(但不是全部)STL在90年代末成爲std lib的一部分。還有很多std lib的其他部分,雖然(字符串,流......),所以「STL」不是「標準庫」的同義詞。 – sbi 2009-10-30 19:25:13

+0

另外,你的std lib已經在'std :: tr1'的命名空間中提供'unordered_map'了。 TR1(技術報告1)列出了許多應該成爲下一個標準的一部分的庫,並鼓勵供應商提供這些庫。它被廣泛採用。如果你的std lib沒有它,http :: www.boost.org上的boost庫有一個實現。 – sbi 2009-10-30 19:27:58