基本问题:指向unordered_map(C ++)中对象的指针

时间:2009-10-31 00:06:16

标签: c++ unordered-map

我是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();

我发现经过一段时间后,我的应变指针指向垃圾。

2 个答案:

答案 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);