2010-01-20 17 views
10

के लिए कस्टम हैश फ़ंक्शन और समानता फ़ंक्शन को परिभाषित करना मैं एक प्रकार का अनॉर्डर्ड_मैप परिभाषित करने की कोशिश कर रहा हूं जिसमें एक कस्टम हैश फ़ंक्शन और समानता तुलना फ़ंक्शन है। इन कार्यों के समारोह प्रोटोटाइप इस प्रकार हैं:unordered_map

//set<Vertex3DXT*> is the type of the key; Cell3DXT* is the type of the value 
size_t VertexSetHashFunction(set<Vertex3DXT*> vertexSet); //hash function 
bool SetEqual(set<Vertex3DXT*> a, set<Vertex3DXT*> b); //equality 

मैं इन समारोह प्रोटोटाइप घोषणा की है और उसके बाद मैं इस प्रकार प्रकार की घोषणा करने का प्रयास करें:

typedef std::tr1::unordered_map<set<Vertex3DXT*>, Cell3DXT*, VertexSetHashFunction, SetEqual> CellDatabaseMapType; 

लेकिन यह कहना है कि VertexSetHashFunction और SetEqual हैं वैध टेम्पलेट प्रकार तर्क नहीं है। दस्तावेज भ्रमित कर रहा है क्योंकि यह बिल्कुल नहीं कहता कि टेम्पलेट तर्क किस प्रकार के होते हैं - क्या मुझे बस यह कार्य करना है जैसा मैंने यहां किया था, या क्या कोई अन्य प्रकार की वस्तु है जो फ़ंक्शन को समाहित करती है (क्योंकि दस्तावेज "हैश फ़ंक्शन ऑब्जेक्ट प्रकार" के बारे में बात करता है)?

+0

क्या आप अभी भी इस प्रश्न की परवाह करते हैं? – Omnifarious

+0

अनुस्मारक के लिए धन्यवाद - उत्तर में से एक जवाब वह उत्तर था जिसे मैं चाहता था कि मैं इसे स्वीकार करना भूल गया। मैंने अभी इसे स्वीकार कर लिया है। – Alex319

उत्तर

9

दुर्भाग्यवश, उन कार्यों को कक्षा में ऑपरेटर() के रूप में घोषित किया जाना चाहिए। इस तरह:

class VertexSetHashFunction { 
    public: 
    ::std::size_t operator()(const ::std::set<Vertex3DXT*> &vertexSet) const; 
}; 
class SetEqual { 
    public: 
    bool operator()(const ::std::set<Vertex3DXT*> &a, const ::std::set<Vertex3DXT*> &b) const; 
}; 

आप स्थिरांक संदर्भ होने के लिए तर्क को संशोधित करने की जरूरत नहीं है, लेकिन मैं अत्यधिक यह सलाह देते हैं। एक :: std :: सेट की एक प्रति बनाना अपेक्षाकृत महंगा है और आपको इसे तब तक नहीं करना चाहिए जब तक आपको बिल्कुल नहीं करना चाहिए।

पिछला कॉन्स सिर्फ इसलिए है क्योंकि ऑपरेटर वास्तव में कक्षा राज्य को वास्तव में संशोधित नहीं करता है, अधिकतर क्योंकि कोई भी नहीं है। स्पष्ट रूप से कहना अच्छा है।

वैकल्पिक रूप से, आप :: std :: हैश टेम्पलेट के अपने स्वयं के विशेषज्ञता को परिभाषित कर सकते हैं। यदि वास्तव में एक मानक तरीका है जिसे आप चाहते हैं तो एक मानक तरीका है क्योंकि यह टेम्पलेट डिफ़ॉल्ट रूप से उपयोग किया जाता है यदि आप unordered_map या unordered_set पर हैश फ़ंक्शन नहीं देते हैं और कुछ भी हैश फ़ंक्शन की आवश्यकता है।

5

आपको मज़दूरों की आवश्यकता है।

struct VertexSetHashFunction { 
    size_t operator() (const set<Vertex3DXT*>& vertexSet) const { return /*whatever*/; } 
}; 

struct SetEqual { 
    bool operator() (const set<Vertex3DXT*>& a, const set<Vertex3DXT*>& b) const { return /*whatever*/; } 
}; 
+1

वापसी 0 एक भयानक विचार है। – njamesp

+9

@njamesp: आप गंभीरता से सोचते हैं कि मैं ओपी को इस तरह के कार्य को लागू करने के लिए चाहता हूं जब मैं 'झूठी वापसी' लिखता हूं, SetEqual में? * श्वास * – kennytm

+0

नोट, जैसा कि केनीटीएम के उदाहरण में, मकसद भी structs हो सकता है। –

संबंधित मुद्दे