私は C++ プログラミングの初心者であり、事前の知識をあまり前提としない回答をいただければ幸いです。
ここでの提案のおかげで、順序付けられていないマップを作成しました。
typedef std::tr1::unordered_map<std::string, Strain*> hmap;
このマップのデータは、クラス Strain のインスタンスへのポインターです。これらのインスタンスが作成されるとすぐに、それらへのポインターを作成し、これらのポインターをハッシュ テーブル (hmap StrainTable) と別のベクトル (vector< Strain *> liveStrains) に追加します。たとえば、次のようになります。
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 );
liveStrains.push_back( firstStrainPtr );
strainTable[ MRCA ]= firstStrainPtr;
クラス Strain のインスタンスは決して削除されません。また、それらへのポインタがひずみテーブルから削除されることもありません。vector< Strain * > liveStrains と vector< Strain * > deadStrains の間でポインターが時々移動しますが、一度ひずみテーブルに置かれると、それらはひずみテーブルにとどまります。
これはコーシャですか?基になるインスタンスが破棄されない限り、それらに追加されたポインターはそのまま残りますか?
たとえば、最初のエントリに、
hmap::const_iterator itr1 = strainTable.begin();
int id = (itr1->second)->getStrainID();
しばらくすると、strainTable のポインターがガベージを指していることがわかりました。