Основные вопросы: указатели на объекты в unordered_map (C ++)
-
22-07-2019 - |
Вопрос
Я новичок в программировании на C ++ и буду очень признателен за ответы, в которых не требуется много предварительных знаний.
Благодаря предложениям здесь я создал неупорядоченную карту:
typedef std::tr1::unordered_map<std::string, Strain*> hmap;
Данные на этой карте являются указателями на экземпляры класса Strain. Как только эти экземпляры созданы, я создаю для них указатели, а затем добавляю эти указатели в мою хэш-таблицу (hmap StraightTable) и в другой вектор (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 никогда не удаляются, и указатели на них не удаляются из straTable. Иногда указатели перемещаются между вектором & Lt; Напряжение * & GT; liveStrains и vector < Напряжение * & GT; deadStrains, но когда-то на straTable, они остаются на straTable.
Это кошерный? Пока базовые экземпляры никогда не будут уничтожены, будут ли добавленные к ним указатели оставаться неизменными?
Правильно ли также, что я всегда смог получить атрибуты-члены из указателей в straTable, используя, например, для первой записи
hmap::const_iterator itr1 = strainTable.begin();
int id = (itr1->second)->getStrainID();
Я обнаружил, что через некоторое время указатели в моей таблице переходов указывают на мусор.
Решение
Указатель на любой объект, выделенный с помощью new
, будет оставаться действительным до тех пор, пока вы не вызовете delete
для этого объекта. Вы можете скопировать указатель сколько угодно, и он будет действителен до тех пор, пока базовый объект не будет удален.
Во-вторых, да, вы правы, что вы можете получить доступ к атрибутам объекта из сохраненных указателей с помощью итераторов контейнера. Но всегда проверяйте, чтобы возвращаемое значение hmap :: find () не было равно hmap :: end ().
То, что вы описываете, хорошо. Теперь, что касается того, почему указатели в вашем файле таблицы могут указывать на мусор, я не могу сказать без более подробной информации. Вы уверены, что нигде не удаляете объекты? Вы уверены, что когда вы копируете указатели с одного вектора на другой, вы делаете это правильно?
Другие советы
если вы никогда не delete
их, значит, с указателями все в порядке. С другой стороны, вы можете захотеть сохранить порядок и использовать стандартные контейнеры для всего шебанга. Р>
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);