2012-07-06 16 views
5
class Widget; 

std::vector< std::shared_ptr<Widget> > container 

class Criterium 
{ 
public: 
    bool operator()(const Widget& left, const Widget& right)const; 
}; 

मैं क्रिटेरियम, के अनुसार कंटेनर कैसे सॉर्ट कर सकते हैं बिना की तरह एक और criterium को परिभाषित:std :: shared_ptr <Widget> ऑब्जेक्ट्स के कंटेनर को सॉर्ट करने के लिए कैसे करें?

class CriteriumForPointers 
{ 
public: 
    bool operator()(const std::shared_ptr<Widget>& left, 
        const std::shared_ptr<Widget>& right)const; 
}; 
+0

मेरा मतलब है, वहाँ कुछ सी ++ 11 जादू मैं उपयोग कर सकते हैं? Std :: sort कमांड से पहले, रन पर कुछ फ़ंक्शन ऑब्जेक्ट को परिभाषित करें, ... –

उत्तर

8

आप एक के रूप में एक लैम्ब्डा इस्तेमाल कर सकते हैं n अनुकूलक:

Criterium criterium; 
sort(container.begin(), container.end(), 
    [&criterium] (const shared_ptr<Widget> &l, const shared_ptr<Widget> &r) 
    { 
     return criterium(*l.get(), *r.get()); 
    } 
); 
+0

कूल! यही वह था जिसे मैं ढूंढ रहा था, लेकिन खुद को आविष्कार करने के लिए पर्याप्त स्मार्ट नहीं था! –

+0

इस मामले में साझा पॉइंटर्स के लिए कॉन्स्ट संदर्भ का उपयोग करें, आप अनावश्यक प्रतियां/सिंक्रनाइज़ेशन कर रहे हैं। – Klaim

+0

@Klaim: पूर्वदर्शी में स्पष्ट, पता नहीं क्यों मुझे याद आया। सूचना के लिए धन्यवाद। – Jon

1

हो सकता है कि आप की तरह अपने क्रिटेरियम-classe में ऑपरेटर की एक दूसरी अधिभार() डाल सकता है, इस:

class Criterium { 
    bool operator()(const Widget& left, const Widget& right)const; 
    bool operator()(const std::shared_ptr<Widget>& left, 
        const std::shared_ptr<Widget>& right)const 
    { return operator()(*left, *right); } 
}; 

(ध्यान दें: मैं इस परीक्षण नहीं किया है)

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