سؤال

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

إذا كنت قلقًا بشأن السرعة ، ولم تكن قلقًا بشأن إدارة الأوتار ، فاختر خوارزمية التجزئة المفضلة لديك وتطبيقها على بيانات السلسلة.

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