3

这是我第一次制作哈希表。我正在尝试将字符串(键)与指向 Strain 类的对象(数据)的指针相关联。

// 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;

我收到一条错误消息,内容为“'((Simulation*)this)->Simulation::liveStrainTable[MRCA]' 中的 'operator[]' 不匹配”。我也尝试过以不同的方式使用“liveStrainTable.insert(...)”,但无济于事。

真的很想在这方面提供一些帮助。我很难理解适用于 SGI hash_map 的语法,而SGI 参考几乎没有为我澄清任何事情。谢谢。

4

5 回答 5

3

试试liveStrainTable[ MRCA.c_str() ]= firstStrainPtr;。它期望const char *作为键值的类型,但MRCA具有 type string

另一种方法是更改liveStrainTable​​为:

hash_map< string, Strain *, hash<string>, eqstr > liveStrainTable;
于 2009-10-29T19:15:10.127 回答
2

其他人回答了您的直接问题,但我可以建议使用unordered_map代替 - 它与 STL 的下一版本一起提供,并且受到所有主要编译器的支持。

于 2009-10-29T19:20:04.247 回答
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;
于 2009-10-30T16:07:44.290 回答
0

hash_map 使用 const char * 作为键类型定义,并且您在访问时使用 std::string 作为键。这是两种不同的类型,模板没有为第二种类型构建运算符,所以这是一个错误。使用 std::string 定义哈希图或使用 MRCA.c_str()

于 2009-10-29T19:17:37.590 回答
0

现在,你有一个类型不匹配。您在char const *预期 a 的地方传递 MRCA(一个字符串)。您可以使用从字符串c_str()中获取 a char const *,或者(更好)更改哈希表的定义以将字符串作为其键类型。

于 2009-10-29T19:19:21.227 回答