我是C ++编程的新手,非常感谢那些没有多少先验知识的回复。
感谢此处的建议,我创建了一个无序的地图:
typedef std::tr1::unordered_map<std::string, Strain*> hmap;
此映射中的数据是指向Strain类实例的指针。一旦创建了这些实例,我就创建指向它们的指针,然后我将这些指针添加到我的哈希表(hmap strainTable)和另一个向量(vector&lt; Strain *&gt; 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的实例永远不会被删除,也不会从strainTable中删除它们的指针。指针偶尔会在矢量&lt;之间移动。应变*&gt; liveStrains和vector&lt;应变*&gt; deadStrains,但曾经在应变表上,他们仍然坚持应变表。
这是犹太人吗?只要基础实例永远不会被销毁,添加到它们的指针是否会保持不变?
我应该始终能够通过使用例如第一个条目从strainTable中的指针获取成员属性,这是正确的吗
hmap::const_iterator itr1 = strainTable.begin();
int id = (itr1->second)->getStrainID();
我发现经过一段时间后,我的应变指针指向垃圾。
答案 0 :(得分:2)
指向分配有new
的任何对象的指针将保持有效,直到您在对象上调用delete
为止。您可以根据需要复制指针,只要基础对象尚未删除,它就会有效。
其次,是的,您可以通过容器迭代器从存储的指针访问对象属性。但请务必检查以确保hmap :: find()的返回值不等于hmap :: end()。
所以你描述的很好。现在,至于为什么你的strainTable中的指针最终指向垃圾,我不能说没有更多的细节。你确定你没有删除任何对象吗?你确定当你将指针从一个向量复制到另一个向量时,你是否正确地做到了?
答案 1 :(得分:1)
如果你从未delete
他们,那么指针仍然可以。另一方面,您可能希望保持整洁,并为整个shebang使用标准容器。
typedef std::tr1::unordered_map<std::string, Strain> hmap;
typedef std::tr1::unordered_map<std::string, hmap::iterator> weakhmap;
hmap strainTable;
weakhmap liveStrains;
Strain firstStrain( idCtr, MRCA, NUM_STEPS );
strainTable[MRCA] = firstStrain;
liveStrains[MRCA] = strainTable.find(MRCA);