"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تنفيذ وظيفة التجزئة العامة لل tuples في مجموعات غير مرتبة؟

كيفية تنفيذ وظيفة التجزئة العامة لل tuples في مجموعات غير مرتبة؟

نشر في 2025-03-26
تصفح:271

How to Implement a Generic Hash Function for Tuples in Unordered Collections?

وظيفة تجزئة عامة للتجمعات في المجموعات غير المرتبة

ومع ذلك ، يمكن أن يؤدي استخدام tuples كمفاتيح في هذه المجموعات دون تحديد وظيفة التجزئة المخصصة إلى سلوك غير متوقع. struct std :: hash > { size_t applator () (std :: tuple const & tuple) const {...} } ؛

في حين أن هذا النهج يعمل ، يمكن أن يكون مملاً لتحديد وظائف التجزئة لكل نوع tuple المستخدمة. لأتمتة هذا ، يمكن تنفيذ وظيفة التجزئة العامة على النحو التالي:

template
struct std::hash<:tuple int>> {
  size_t operator()(std::tuple const& tuple) const { ... }
};

هذه الوظيفة تعزز بحث الاسم المعتمد على الوسيطة (ADL) للسماح للمترجم بتحديد تطبيق التجزئة الصحيح تلقائيًا استنادًا إلى نوع tuple.

#include 

namespace std {
  namespace {

    // Code derived from Boost
    template
    inline void hash_combine(std::size_t& seed, T const& v) { ... }

    // Recursive template code from Matthieu M.
    template::value - 1>
    struct HashValueImpl { ... };

  }

  template
  struct hash<:tuple>> {
    size_t operator()(std::tuple const& tuple) const { ... }
  };
}
للحصول على حل متوافق مع المعايير ، يمكن إنشاء مساحة اسم مخصصة واستخدامها لتحديد وظيفة التجزئة:

مساحة الاسم my_hash { // الأنواع غير المتقدمة إلى std :: hash قالب هيكل التجزئة {...} ؛ // توفير التجزئة المحسنة لـ tuples قالب هيكل hash > {...} ؛ }

عند استخدام هذا الحل ، يجب أن تشير المجموعة غير المرتبة صراحة إلى تطبيق التجزئة المخصصة على النحو التالي:

unordered_set ، std :: hash > ، std :: equal_to > > اختبار

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3