ব্যবহারকারী-সংজ্ঞায়িত কী ধরনের সমর্থন করার জন্য std::unordered_set<Key>
এবং std::unordered_map<Key, Value>
এক প্রদান করেছেন operator==(Key, Key)
এবং একটি হ্যাশ functor:
struct X { int id; /* ... */ };
bool operator==(X a, X b) { return a.id == b.id; }
struct MyHash {
size_t operator()(const X& x) const { return std::hash<int>()(x.id); }
};
std::unordered_set<X, MyHash> s;
টাইপ করার জন্য কেবল std::unordered_set<X>
একটি ডিফল্ট হ্যাশ দিয়ে লিখতে আরও সুবিধাজনক হবে X
যেমন সংকলক এবং লাইব্রেরির সাথে আসা প্রকারের জন্য। পরামর্শের পরে
- সি ++ স্ট্যান্ডার্ড খসড়া N3242 §20.8.12 [আনর্ডর্ড.হ্যাশ] এবং .617.6.3.4 [হ্যাশ.রঙ্কিয়মেন্টস],
- Boost.Unordered
- g ++
include\c++\4.7.0\bits\functional_hash.h
- ভিসি 10
include\xfunctional
- স্ট্যাক ওভারফ্লোতে বিভিন্ন সম্পর্কিত প্রশ্ন
এটি বিশেষজ্ঞ করা সম্ভব বলে মনে হচ্ছে std::hash<X>::operator()
:
namespace std { // argh!
template <>
inline size_t
hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } // works for MS VC10, but not for g++
// or
// hash<X>::operator()(X x) const { return hash<int>()(x.id); } // works for g++ 4.7, but not for VC10
}
সি ++ 11 এর জন্য প্রদত্ত সংকলক সমর্থনটি এখনও পরীক্ষামূলক --- আমি ঝাঁকুনির চেষ্টা করিনি --- এগুলি আমার প্রশ্ন:
নেমস্পেসে এই জাতীয় বিশেষত্ব যুক্ত করা কি আইনী
std
? সে সম্পর্কে আমার মিশ্র অনুভূতি আছে।std::hash<X>::operator()
সংস্করণগুলির মধ্যে কোনটি সি ++ 11 স্ট্যান্ডার্ডের সাথে সামঞ্জস্যপূর্ণ?এটি করার কোনও পোর্টেবল উপায় আছে কি?
operator==(const Key, const Key)