أسئلة أساسية: مؤشرات إلى كائنات في unordered_map (C ++)

StackOverflow https://stackoverflow.com/questions/1652901

  •  22-07-2019
  •  | 
  •  

سؤال

وأنا جديدة على C ++ البرمجة، وسوف نقدر كثيرا الردود التي لا تفترض معرفة مسبقة من ذلك بكثير.

وبفضل اقتراحات هنا، لقد خلق خريطة غير مرتبة:

typedef std::tr1::unordered_map<std::string, Strain*> hmap;

والبيانات في هذه الخريطة هي مؤشرات إلى حالات الانفعال الصف. حالما يتم إنشاء هذه الحالات، I إنشاء مؤشرات لهم، وأنا ثم إضافة هذه المؤشرات إلى مائدتي التجزئة (hmap strainTable) وناقلات (ناقلات <سلالة *> 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;
لم يتم حذف

وحالات الإجهاد الطبقة، كما لا مؤشرات إلى إزالتها من strainTable. مؤشرات لا تتحرك أحيانا بين ناقلات <سلالة *> liveStrains وناقلات <سلالة *> deadStrains، ولكن مرة واحدة على strainTable، فإنها تبقى على strainTable.

هل هذا موافق للشريعة اليهودية؟ طالما يتم تدمير الحالات الكامنة أبدا، ستظل مؤشرات أضاف إليها سليمة؟

هل من الصحيح أيضا أنه ينبغي أن يكون دائما قادرا على الحصول على سمات عضو من المؤشرات في strainTable باستخدام، على سبيل المثال، لدخول الأول،

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

وأنا وجدت أنه بعد فترة من الوقت، المؤشرات في وجهة نظري strainTable إلى القمامة.

هل كانت مفيدة؟

المحلول

ومؤشر على أي كائن المخصصة مع new سيبقى ساري المفعول حتى استدعاء delete على الكائن. يمكنك نسخ مؤشر بقدر ما تريد، وسوف تكون صالحة طالما لم يتم حذف الكائن الأساسي.

وثانيا، نعم، كنت على صواب أنه يمكنك الوصول إلى سمات الكائن من مؤشرات المخزنة عن طريق التكرارات الحاوية. ولكن دائما التحقق للتأكد من أن قيمة الإرجاع hmap :: تجد () لا تساوي hmap :: نهاية ().

وهكذا ما تصفون ما يرام. الآن، لماذا مؤشرات في strainTable بك وينتهي بهم المطاف مشيرا إلى القمامة، وأنا لا يمكن أن أقول دون مزيد من التفاصيل. هل أنت متأكد من أنك لا حذف أي أجسام في أي مكان؟ هل أنت متأكد من أنه عند نسخ مؤشرات من الموجه واحدة إلى أخرى، كنت تفعل ذلك بشكل صحيح؟

نصائح أخرى

وإذا لم 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top