मैं just पाया अपने आप को एक छोटा सा बस एकक्या मानक कंटेनरों के लिए std :: हैश की कोई विशेषज्ञता नहीं है?
std::unordered_set<std::array<int, 16> > test;
का उपयोग करने में असमर्थ रहा हैरान कर दिया, क्योंकि वहाँ std::array
रों के लिए एक std::hash
विशेषज्ञता होने के लिए प्रतीत नहीं होता। ऐसा क्यों है? या क्या मुझे बस यह नहीं मिला? यदि वास्तव में कोई नहीं है, तो क्या निम्नलिखित कार्यान्वयन प्रयास को सरल बनाया जा सकता है?
namespace std
{
template<typename T, size_t N>
struct hash<array<T, N> >
{
typedef array<T, N> argument_type;
typedef size_t result_type;
result_type operator()(const argument_type& a) const
{
hash<T> hasher;
result_type h = 0;
for (result_type i = 0; i < N; ++i)
{
h = h * 31 + hasher(a[i]);
}
return h;
}
};
}
मुझे वास्तव में लगता है कि यह किसी भी तरह से मानक पुस्तकालय का हिस्सा होना चाहिए।
वास्तव में केवल एक नहीं है, केवल 'std :: string' और दोस्तों के पास विशेषाधिकार है। क्या मैं वास्तव में अलोकप्रिय हूं यदि मैंने कहा कि ऐसा इसलिए है क्योंकि मानक डेटा संरचनाओं के संदर्भ में कला की वर्तमान स्थिति की ओर खींचने के लिए सी ++ के प्रयास ने अभी तक पूरी नौकरी नहीं की है? असल में, टेम्पलेट्स के लिए कोई भी 'हैश' विशेषज्ञता नहीं है (और इसके बदले में उनके टेम्पलेट तर्कों को हेशेबल होने की आवश्यकता होगी)। केवल आवश्यक विशेषज्ञताएं अंतर्निर्मित प्रकार और चार कंक्रीट स्ट्रिंग कक्षाओं के लिए हैं। तो मुझे संदेह है कि वहां एक रेखा खींची गई थी। –
@ स्टेव: कौन सी कंक्रीट स्ट्रिंग कक्षाएं? – fredoverflow
'स्ट्रिंग', 'u16string',' u32string', 'wstring' (C++ 11 में 21.6)। मैं कहूंगा कि 'जोड़ी' और 'tuple' अगले उच्चतम प्राथमिकता वाले लक्ष्य होना चाहिए, उसके बाद मानक कंटेनर, उसके बाद हैशबल सदस्यों से बना किसी भी समग्र प्रकार के लिए डिफ़ॉल्ट हैश होना चाहिए। –