質問

ハッシュテーブルを作成するのはこれが初めてです。 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)-&gt; Simulation :: liveStrainTable [MRCA]」で「operator []」に一致する&quot;というエラーメッセージが表示されます。」また、&quot; liveStrainTable.insert(...)&quot;を使用してみましたさまざまな方法で利用できません。

これに関するいくつかのヘルプが本当に必要です。 SGI hash_mapに適した構文、および SGIリファレンスは、私にとってはほとんど何も明確にしません。ありがとう。

役に立ちましたか?

解決

liveStrainTable [MRCA.c_str()] = firstStrainPtr; をお試しください。キー値のタイプとして const char * が必要ですが、 MRCA のタイプは string です。

別の方法は、 liveStrainTable を次のように変更することです:

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

他のヒント

他の人があなたの直接の質問に答えましたが、 unordered_map -次のバージョンのSTLに付属しており、すべての主要なコンパイラでサポートされています。

hash_mapはSTLの一部ではありません。ハッシュの実装は提供されていません。つまり、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;

hash_mapは、const char *をキータイプとして定義されており、アクセス時にstd :: stringをキーとして使用しています。これらは2つの異なるタイプであり、テンプレートは2番目のタイプの演算子を作成しなかったため、これはエラーです。ハッシュマップの定義にはstd :: stringを使用するか、MRCA.c_str()を使用します

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top