2009-03-15 8 views
22

मैं अपने कस्टम प्रकारों को लेने के लिए एसटीएल कार्यान्वयन की अनुमति कैसे दूं? MSVC पर, वहाँ एक वर्ग std::tr1::hash, जो मैं आंशिक रूप सेकस्टम प्रकारों के लिए std :: tr1 :: हैश का विस्तार कैसे करें?

namespace std 
{ 
    namespace tr1 
    { 
     template <> 
     struct hash<MyType> 
     { ... }; 
    } 
} 

का उपयोग करके विशेषज्ञ लेकिन यह सुझाया गया तरीका है सकते हैं? इसके अलावा, क्या यह जीसीसी के कार्यान्वयन के साथ भी काम करता है? boost::hash के लिए, यह एक नि: शुल्क फ़ंक्शन size_t hash_value (const MyType&) प्रदान करने के लिए पर्याप्त है, क्या TR1 कार्यान्वयन के लिए कुछ समान है?

+0

क्या निजी प्रतिलिपि बनाने वाले उपयोगकर्ता के परिभाषित प्रकारों के लिए std :: हैश का विस्तार करने का कोई तरीका है? इसके अलावा, क्या इसे ऑपरेटर() के साथ विस्तारित करने का कोई तरीका है जो वैल के बजाय कॉन्स्ट रेफ लेता है? –

+0

टेम्पलेट विशेषज्ञता के साथ क्या समस्या है? आप अपनी ऑब्जेक्ट की प्रतिलिपि नहीं लेते हैं (आप संदर्भों से इसे पास करते हैं), इसलिए कोई समस्या नहीं - और ऑपरेटर() जो भी आप चाहते हैं, एक कॉन्स रेफ या वैल्यू लेता है। फिल नैश के जवाब को देखें, जो ऑब्जेक्ट को कॉन्स रेफरी के रूप में लेता है। – Anteru

उत्तर

4

हां, यह जीसीसी के लिए भी काम करेगा। मैं इसे एक बड़ी परियोजना में उपयोग कर रहा हूं और यह बिना किसी समस्या के काम करता है। आप TR1 कंटेनर के लिए अपनी कस्टम हैशिंग क्लास भी प्रदान कर सकते हैं, लेकिन यह निर्दिष्ट है कि std :: tr1 :: हैश <> डिफ़ॉल्ट हैशिंग क्लास है। कस्टम प्रकारों के लिए इसे विशेषज्ञता देना मानक हैशिंग कार्यक्षमता का विस्तार करने का प्राकृतिक तरीका है।

3

जैसा कि आप std लाइब्रेरी नेमस्पेस में नहीं जोड़ रहे हैं, लेकिन केवल विशेषज्ञता प्रदान करते हैं, तो यह बिल्कुल ठीक है।

यदि आप अधिक सामान्य हैशिंग दृष्टिकोण प्रदान करना चाहते हैं (उदाहरण के लिए सामान्य रूप से टुपल्स के लिए हैश) तो बूस्ट फ़्यूज़न पर एक नज़र डालें। Here is a simple example, जो अधिकांश मामलों के लिए काम करेगा (शायद टुपल्स के टुपल के अपवाद के साथ)

21

मैं अनियंत्रित सहयोगी कंटेनर (जीसीसी का उपयोग करके भी ऐसा करने के लिए सटीक वाक्यविन्यास को काम करने की कोशिश कर रहा था, क्योंकि ओपी था पूछना) और इस सवाल को मारा।

दुर्भाग्य से यह मेरे इच्छित विवरण के स्तर पर नहीं गया। जीसीसी हेडर के माध्यम से देखकर कि उन्होंने मानक हैश फ़ंक्शंस को कैसे कार्यान्वित किया है, मैंने इसे काम किया है। उदाहरण की कमी को देखते हुए वेब पर मैंने सोचा था कि के रूप में किसी भी अपने खुद के उदाहरण पोस्ट करने के लिए (जो मैं जीसीसी के साथ काम करता है इस बात की पुष्टि कर सकते हैं) इस रूप में अच्छा एक जगह होगा (कम से कम लेखन के समय):


namespace std { namespace tr1 
{ 
    template <> 
    struct hash<MyType> : public unary_function<MyType, size_t> 
    { 
     size_t operator()(const MyType& v) const 
     { 
      return /* my hash algorithm */; 
     } 
    }; 
}} 

(नोटिस वहाँ दो नामस्थान यहाँ हैं - कि अभी नेस्ट नामस्थान टूट के लिए मेरे सम्मेलन है)

0

निम्नलिखित कोड का टुकड़ा दिखाता है कि कैसे boost::const_string<char> तुलनात्मक रूप से std::string कैसे मिश्रित होता है साथ void* के मानचित्रण के लिए std::tr1::unordered_map विशेषज्ञ।

#include <boost/const_string/const_string.hpp>  
typedef class boost::const_string<char> csc; 

namespace std 
{ 
namespace tr1 
{ 
template <> 
struct hash<csc> { 
public: 
    size_t operator()(const csc & x) const { 
     return std::_Hash_impl::hash(x.data(), x.size()); 
    } 
}; 
} 
} 

typedef std::tr1::unordered_map<csc, void*> Map; 
typedef Map::value_type Dual; ///< Element Type. 
संबंधित मुद्दे