質問
ハッシュテーブルを作成するのはこれが初めてです。 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 *
を取得するか、(はるかに良い)ハッシュテーブルの定義を変更して、文字列をキーとして使用できますタイプ。