2016-11-02 2 views
7

लेता है कुछ मानक कंटेनर Container<T>comparer कि आदेश में वांछित विशेषता

struct T{ 
    int x,y; 
}; 

y मूल्य के आधार पर पर std::sort की तरह एक मानक समारोह का उपयोग करने के, आप की तरह (उदाहरण के लिए) कुछ लिखने की ज़रूरत:

std::vector<T> v; 
//fill v 
std::sort(v.begin(),v.end(),[](const auto& l,const auto& r){ 
    return l.y<r.y; 
}); 

लैम्बडा फ़ंक्शन के रूप में लिखे गए तुलनाकर्ता को बहुत अधिक उपयोग किया जाता है और विभिन्न वर्गों और विशेषताओं के लिए कोड के दौरान बार-बार लिखा जाता है।

मामले में जहां y के प्रकार तुलनीय (या तो की तरह int या वहाँ < operator के लिए एक अधिभार है), वहाँ किसी भी तरह से की तरह कुछ प्राप्त करने के लिए है ध्यान में रखते हुए:

std::sort(v.begin(),v.end(),imaginary::less(T::y)); // Imaginary code 

यह सी में संभव है ++ करने के लिए less जैसे ऐसे फ़ंक्शन को लिखें? या कुछ भी समान है?

मैं पूछ रहा हूं क्योंकि मुझे कुछ प्रबंधित भाषा में ऐसा कुछ याद है (मुझे यकीन नहीं है कि शायद सी # या जावा)। हालांकि, अगर यह सच है या नहीं, तो मैं इस जानकारी के बारे में भी निश्चित नहीं हूं।

+2

आप कोड है कि आप कहने के लिए 'member_less ()' की अनुमति देता है के साथ खुश होगा? –

+0

@ नाथन: लेकिन यह आपको 'std :: sort'' पर कॉल करने के लिए किस सदस्य को सॉर्ट करने का विकल्प चुनने की अनुमति नहीं देता है। –

+0

@ बेनवोइग आह। मैंने नहीं देखा कि ओपी क्या करने की कोशिश कर रहा था। मुझे मूर्ख। – NathanOliver

उत्तर

7
template<typename T, typename MT> 
struct memberwise_less 
{ 
    MT T::* const mptr; 
    auto operator()(const T& left, const T& right) const 
    { return (left.*mptr) < (right.*mptr); } 
}; 

template<typename T, typename MT> 
memberwise_less<T, MT> member_less(MT T::*mptr) 
{ 
    return { mptr }; 
} 

और फिर आप क्या कर सकते हैं

std::sort(v.begin(), v.end(), member_less(&T::y)); 
+0

यह संकलित-परीक्षण नहीं है ... यदि आप एक वेक्टर केस साझा करते हैं जो वेक्टर बनाता है, परिणाम प्रिंट करता है, आदि, तो मुझे इसे परीक्षण में जोड़ने में खुशी होगी। –

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