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タイプは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 の実装は提供されていません。つまり、hash_map はデフォルトで文字列をハッシュできません。独自のハッシュ関数が必要です。T

試す:

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 をキーとして使用しています。これらは 2 つの異なるタイプであり、テンプレートは 2 番目のタイプのオペレーターを構築しなかったため、これはエラーです。ハッシュマップ定義に std::string を使用するか、MRCA.c_str() を使用します。

于 2009-10-29T19:17:37.590 に答える
0

現在、タイプの不一致があります。char const *aが期待される場所に MRCA (文字列) を渡しています。を使用c_str()して文字列から を取得するかchar const *、(はるかに良い) ハッシュ テーブルの定義を変更して文字列をキー タイプとして取得することができます。

于 2009-10-29T19:19:21.227 に答える