2009-10-29 70 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