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