将对象插入哈希表(C ++)

时间:2009-10-29 19:11:57

标签: c++ hashmap sgi

这是我第一次制作哈希表。我正在尝试将字符串(键)与指向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;

我收到一条错误消息,内容为“((模拟*)这里的''运算符[]'不匹配 - &gt;模拟:: liveStrainTable [MRCA]'。”我也尝试过以不同的方式使用“liveStrainTable.insert(...)”,但无济于事。

真的很喜欢这方面的帮助。我很难理解适合SGI hash_map的语法,而SGI reference几乎没有为我澄清任何内容。感谢。

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

其他人回答了您的直接问题,但我建议您使用unordered_map - 它将与STL的下一个版本一起使用,并得到所有主要编译器的支持。

答案 2 :(得分: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;

答案 3 :(得分:0)

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

答案 4 :(得分:0)

目前,您的类型不匹配。您正在通过MRCA(字符串),预计会有char const *。您可以使用c_str()从字符串中获取char const *,或者(更好)更改哈希表的定义以将字符串作为其键类型。