2013-04-28 10 views
5

यह परिभाषाओं OuterClass के अंदर कर रहे हैं के साथ वस्तु की तुलना करें:सी ++ एसटीएल सेट: बाह्य राज्य

struct Compare 
{ 
    bool operator()(const T&, const T&); 
}; 
typedef set<T, Compare> MySet; 

मेरे समस्या तुलना कि समारोह operator()OuterClass की स्थिति पर निर्भर करता है। (MySet उदाहरणों एक अनुकूलन के लिए एक एल्गोरिथ्म के दौरान प्रयोग किया जाता है और वे विभिन्न चरणों में अलग ढंग से सुलझाने के लिए है।)

वहाँ किसी भी तरह से/वैकल्पिक हल तुलना समारोह operator() के भीतर से OuterClass की nonstatic सदस्यों तक पहुँचने के लिए है?

उत्तर

5

तुलनात्मक कार्य ऑपरेटर() के भीतर से OuterClass के nonstatic सदस्यों तक पहुंचने के लिए कोई तरीका/कामकाज है?

वहाँ है। बस Compare कि स्वीकार करता है और OuterClass के लिए एक संदर्भ दुकानों के लिए एक उपयोगकर्ता परिभाषित निर्माता लिखते हैं, इस तरह से:

struct Compare 
{ 
    Compare(OuterClass& o) : oc(o) { } 
    bool operator()(const T&, const T&) 
    { 
     // Uses oc somehow... 
    } 
private: 
    OuterClass& oc; 
}; 

तब, जब आप अपने निर्धारित बनाने के लिए, आप की तरह कुछ कर सकते हैं:

int main() 
{ 
    typedef std::set<T, Compare> MySet; 

    OuterClass oc; // <== Construct an object of type Outerclass somehow... 

    MySet ms(Compare(oc)); // <== Construct your comparator and pass it 
          //  in input to the constructor of std::set 
} 

खबरदार हालांकि: ऑर्डरिंग मानदंड स्थिर रहना चाहिए। तत्वों को हमेशा एक ही सेट के लिए इसकी तुलना करना चाहिए। प्रति पैरा सी ++ 11 स्टैंडर्ड की 23.2.4/3:

वाक्यांश "चाबियों का तुल्यता" तुल्यता संबंध तुलना द्वारा लगाए गए और चाबी पर नहीं operator== का मतलब है। यही है, ऑब्जेक्ट comp, comp(k1, k2) == false && comp(k2, k1) == false तुलना के लिए दो कुंजी k1 और k2 समकक्ष समझा जाता है। में किसी भी दो कुंजियों के 1 और के 2 के लिए एक ही कंटेनर, comp(k1, k2) पर कॉल करने से हमेशा वही मान वापस आ जाएगा।

+0

आह, मैं सेट कन्स्ट्रक्टर को देखना भूल गया, इसलिए मुझे नहीं पता था कि मैं तुलनित्र वस्तु को अपने आप बना सकता हूं। सी ++ 11 मानक के बारे में टिप के लिए धन्यवाद - मैं इसे ध्यान में रखता हूं :) बहुत बहुत धन्यवाद! – schoettl

+0

@ user999007: आपका स्वागत है, आपकी परियोजना के साथ शुभकामनाएँ;) –

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