unordered_set من متطلبات tchar*؟
-
28-09-2019 - |
سؤال
أرغب في استخدام بنية البيانات التي تخدم مثل .NET HASHSET ، حاولت استخدام unordered_set مع طريقة التجزئة الافتراضية والمقارنة المخصصة على النحو التالي:
struct comparer
{
bool operator()( const TCHAR* first,const TCHAR* second) const
{
return _tcscmp((TCHAR*)first,(TCHAR*)second) == 0;
}
};
typedef unordered_set<const TCHAR*,hash<const TCHAR*>,comparer> HashSet;
المشكلة هي عندما حاولت استخدام Hashtset للعثور على مفتاح محدد (باستخدام find
الطريقة) هذه هي فقط أضفت استخدام insert
يعود HashSet::end()
!!
هل يمكن أن تشرح ما هي المشكلة؟ أنا أستخدم VC ++ ضمن VS2010
المحلول
افترض أن hash
هنا std::hash
, ، لا يوجد تخصص std::hash
إلى عن على char*
أو wchar*
بخلاف التخصص العام لأي نوع من المؤشر ، فإن التجزئة بناءً على قيمة المؤشر.
لذا ، إذا كنت تريد الاستخدام TCHAR*
كمفتاح التجزئة ، مع وجود تجزئة استنادًا إلى محتويات السلسلة بدلاً من قيمة المؤشر ، ستحتاج إلى توفير فئة مختلفة من فئة التجزئة.
هناك تخصصات من std::hash
إلى عن على string
و wstring
, ، أعتقد أنه يمكنك استخدامه إذا اخترت الصحيح وفقًا لـ _UNICODE
. أقول "أعتقد" لأن tchar* يجب أن يتحول إلى فقط string
أو wstring
, ، ولكن إذا فاتني شيء ما ، فيمكنك كتابة غلاف بسيط.
إذا كنت ستفعل أيًا من هؤلاء ، فيمكنك استخدامك أيضًا string
أو wstring
كمفتاح التجزئة ، نظرًا لأن كل شيء سيحتاج إلى تحويله إلى التجزئة على أي حال. سيتيح لك ذلك أيضًا إضافة سلاسل إلى unordered_set دون الحاجة إلى إبقائها معلقة حتى يتم إزالتها. مع الكود الخاص بك أعلاه ، أتصور أنه مصدر إزعاج يضيف أي شيء آخر غير حرفي السلسلة إلى المجموعة.
إذا كنت قلقًا بشأن السرعة ، ولم تكن قلقًا بشأن إدارة الأوتار ، فاختر خوارزمية التجزئة المفضلة لديك وتطبيقها على بيانات السلسلة.