4

我是 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 类的实例永远不会被删除,指向它们的指针也不会从 strainTable 中删除。指针偶尔会在 vector< Strain * > liveStrains 和 vector< Strain * > deadStrains 之间移动,但是一旦在 strainTable 上,它们就会停留在 strainTable 上。

这是犹太洁食吗?只要底层实例永远不会被破坏,添加到它们的指针会保持不变吗?

我应该总是能够通过使用例如第一个条目从 strainTable 中的指针获取成员属性是否也是正确的,

 hmap::const_iterator itr1 = strainTable.begin();
 int id = (itr1->second)->getStrainID();

我发现过了一会儿,我的 strainTable 中的指针指向垃圾。

4

2 回答 2

2

指向任何已分配对象的指针new将保持有效,直到您调用delete该对象。你可以随意复制指针,只要底层对象没有被删除,它就有效。

其次,是的,您可以通过容器迭代器从存储的指针访问对象属性是正确的。但始终检查以确保 hmap::find() 的返回值不等于 hmap::end()。

所以你描述的很好。现在,至于为什么您的 strainTable 中的指针最终指向垃圾,我不能说没有更多细节。你确定你没有在任何地方删除任何对象吗?你确定当你将指针从一个向量复制到另一个向量时,你做对了吗?

于 2009-10-31T00:51:04.067 回答
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);
于 2009-10-31T00:17:51.647 回答