سؤال

لقد كنت أبحث في مُنشئو Unordered_set. أليس من الممكن إنشاء unordered_set مع مثيل مخصص مخصص دون تعيين عدد دلاء التجزئة؟ أفضل حقًا عدم العبث بتفاصيل التنفيذ لأنني أريد تخصيصًا مخصصًا ، ولا يوفر النوع أي تعريفات للقيمة الافتراضية. يعطي MSDN فقط مثل ثلاثة أحمال زائدة للمشارك ، لا شيء مفيد بشكل رهيب.

تحرير: حماقة مقدسة. لن يتخصص تنفيذ STL الخاص بـ STL لـ STD :: Hash للسلاسل بنوع مخصص مخصص- يمكنه فقط القيام بـ Typedefs الصريح std :: string و std :: wstring. أعني ، أستطيع أن أفهم عدم الرغبة في محاولة تجزئة سلاسل الأحرف العشوائية ، ولكن لمجرد أنها حصلت على مخصص مخصص؟ هذا يثير الاشمئزاز لي.

tokens(std::unordered_set<string>().bucket_count(), std::hash<string>(), std::equal_to<string>(), stl_wrapper::hash_set<string>::allocator_type(this))
template<typename Char, typename CharTraits, typename Allocator> class std::hash<std::basic_string<Char, CharTraits, Allocator>>
    : public std::unary_function<std::basic_string<Char, CharTraits, Allocator>, std::size_t> {
public:
    size_t operator()(const std::basic_string<Char, CharTraits, Allocator>& ref) const {
        return std::hash<std::basic_string<Char, CharTraits>>()(std::basic_string<Char, CharTraits>(ref.begin(), ref.end()));
    }
};

يحل المشاكل ، ولكن الإنشاءات الزائدة والنسخ؟ ewwwww.

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

المحلول

هذا غريب ، لكنك على حق. أفترض أن الفكر هو أنه من المبالغة في دعم جميع مجموعات المعلمات الممكنة ، مع الافتراضات.

أفضل طريقة يمكنني التفكير في التعامل معها هي بناء فارغة unordered_set مع جميع الإعدادات الافتراضية ، احصل على عدد الدلو الافتراضي منه باستخدام unordered_set::bucket_count, ، ثم استخدم ذلك كمدخل عند إنشاء الحاوية التي تريدها بالفعل.

unordered_set<int> temp;
size_t buckets = temp.bucket_count;
unordered_set<string> actual(buckets, Hash(), Pred(), 
    YourAllocator(param1 /*, etc */));

نصائح أخرى

بما أنك تكتب Allocator, ، من المنطقي التحكم في عدد الدلاء أيضًا ، بعد كل شيء مرتبط بالذاكرة :)

أعطى ستيف قلب الطريقة إذا كنت لا تريد ذلك ، والآن دعني أقترح وظيفة مساعد :)

template <typename T>
size_t number_buckets()
{
  std::unordered_set<T> useless;
  return useless.bucket_count();
}

ومع ذلك ، مساعد صغير (بسيط):

template <typename T, typename Hash, typename Pred, typename Allocator>
std::unordered_set<T,Hash,Pred,Allocator>
  make_unordered_set(Hash const& hash, Pred const& pred, Allocator const& alloc)
{
  static size_t const nbBuckets = number_buckets<T>();
  return std::unordered_set<T,Hash,Pred,Allocator>(nbBuckets, hash, pred, alloc);
}

يعمل بشكل جيد مع auto:

auto set = make_unordered_set<std::string>(Hash(), Pred(), Allocator(1,2,3));

يمكنك أيضًا ، بطبيعة الحال ، أن تمزق الثابت من تطبيقك المفضل.

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