سؤال

هذه هي المرة الأولى التي أقوم فيها بإنشاء جدول التجزئة.أحاول ربط السلاسل (المفاتيح) بمؤشرات للكائنات (البيانات) الخاصة بالفئة Strain.

// Simulation.h
#include <ext/hash_map>
using namespace __gnu_cxx;

struct eqstr
{
 bool operator()(const char * s1, const char * s2) const
  {
   return strcmp(s1, s2) == 0;
  }
};

...
hash_map< const char *, Strain *, hash< const char * >, struct eqstr > liveStrainTable;

في ملف Simulation.cpp، أحاول تهيئة الجدول:

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 );
liveStrainTable[ MRCA ]= firstStrainPtr;

أحصل على رسالة خطأ تقرأ "لا تطابق لـ" المشغل [] "في ((محاكاة*) هذا)-> المحاكاة :: livestrainable [MRCA]. لقد حاولت أيضًا استخدام "livestrainable.insert (...)" بطرق مختلفة ، ولكن دون جدوى.

أحب حقا بعض المساعدة في هذا الشأن.أواجه صعوبة في فهم بناء الجملة المناسب لـ SGI hash_map، و مرجع SGI بالكاد يوضح أي شيء بالنسبة لي.شكرًا.

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

المحلول

يحاول liveStrainTable[ MRCA.c_str() ]= firstStrainPtr;.انها تتوقع const char * كنوع من القيمة الرئيسية، ولكن MRCA لديه نوع string.

هناك طريقة أخرى وهي التغيير liveStrainTable ل:

hash_map< string, Strain *, hash<string>, eqstr > liveStrainTable;

نصائح أخرى

أجاب الآخرون على سؤالك المباشر، ولكن هل لي أن أقترح استخدام خريطة غير مرتبة بدلاً من ذلك - يأتي مع الإصدار التالي من STL ويدعمه جميع المترجمين الرئيسيين.

hash_map ليس جزءًا من STL.لا يوجد أي تطبيق متوفر للتجزئة، أو بمعنى آخر، لا يمكن لـ hash_map تجزئة السلاسل بشكل افتراضي.أنت بحاجة إلى وظيفة التجزئة الخاصة بك.ت

يحاول:

typedef struct {
  size_t operator()( const string& str ) const {
     return __gnu_cxx::__stl_hash_string( str.c_str() );
  }
} strhash;

hash_map< string, Strain *, strhash, eqstr > liveStrainTable;

يتم تعريف hash_map باستخدام const char * كنوع المفتاح وأنت تستخدم std::string كمفتاح عند الوصول.هذان نوعان مختلفان، ولم ينشئ القالب عامل تشغيل للنوع الثاني، لذا فهذا خطأ.استخدم std::string لتعريف hashmap أو استخدم MRCA.c_str()

في الوقت الحالي، لديك نوع غير متطابق.أنت تقوم بتمرير MRCA (سلسلة) حيث a char const * متوقع.يمكنك إما استخدام c_str() للحصول على char const * من السلسلة، أو (الأفضل بكثير) قم بتغيير تعريف جدول التجزئة الخاص بك ليأخذ سلسلة كنوع مفتاح خاص به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top