2010-10-22 5 views
6

एक वर्ग ए पर विचार करें जिसमें सदस्य x और std :: vector < ए> है। अब वेक्टर के अंदर सभी तत्वों के बीच अधिकतम x की खोज करने का एक आम कार्य है। स्पष्ट रूप से मैं केवल xd पर एक इटरेटर होने पर std :: max_element का उपयोग कर सकता हूं। लेकिन मुझे अपने आप से एक लिखना चाहिए, या मैं सिर्फ लूप के लिए एक सरल बना देता हूं।एक वेक्टर के max_element को ढूँढना जहां एक सदस्य का उपयोग यह तय करने के लिए किया जाता है कि यह अधिकतम

maxSoFar = -std::numeric_limits<double>::max(); 
for(std::vector<A>::const_iterator cit = as.begin(); cit != as.end(); ++cit) 
{ 
    if(cit->x > maxSoFar) 
    maxSoFar = cit->x; 
} 

लेकिन यह बहुत कठिन है, और मैं बहुत आलसी हूं .. क्या कोई बेहतर विकल्प है?

+0

आप 'boost' उपयोग कर सकते हैं? – Naveen

+0

हां हमारी परियोजना किसी भी तरह से बढ़ावा देती है, लेकिन मैं इसके लिए बढ़ावा कैसे उपयोग करूं? – math

उत्तर

6

आप तो boost उपयोग कर सकते हैं, तो आप कर सकते हैं उम्मीद द्विआधारी विधेय के लिए एक लैम्ब्डा अभिव्यक्ति लिखने max_element द्वारा:

struct A 
{ 
    A(int n): x(n) 
    { 
    } 
    int x; 
}; 

using namespace std; 
using namespace boost::lambda; 

int main() 
{ 
    vector<A> as; 
    as.push_back(A(7)); 
    as.push_back(A(5)); 
    as.push_back(A(3)); 

    vector<A>::iterator iter = max_element(as.begin(), as.end(), bind(&A::x, _2) > bind(&A::x, _1)); 
    int max = iter->x; 
} 
+0

बहुत बढ़िया, यह एक आकर्षण की तरह काम करता है, और यह वास्तव में एक छोटा सा कट है। मुझे लगता है कि मुझे बढ़ावा में अधिक खुदाई करना चाहिए :: लैम्ब्डा सामान: डी, ​​एसएसपी। इसका बाध्य जादू, धन्यवाद। – math

1

1) यह करने के लिए 1 लाइन बदलें:

maxSoFar = *(as.begin()); 

2) एक कस्टम तुलनित्र लागू करें, और प्रयोग max_element (के रूप में आप चाहते थे): http://www.cplusplus.com/reference/algorithm/max_element/

+1

आपकी पहली युक्ति वास्तव में वास्तव में खराब है। क्या होगा अगर as.empty() == सच है? – f0b0s

21

आप मीटर करने के लिए एक तुलनित्र पारित कर सकते हैं ax_element। और अपने संकलक lambdas समर्थन करता है तो (यह शायद करता है), इस आसान है:

std::max_element(as.begin(), as.end(), 
    [](A a, A b){ return a.x < b.x; }); 
+0

हम यहां कई जीसीसी का उपयोग कर रहे हैं: 4.4.3, 4.3.x, 4.2.x (मैक ओएसएक्स), एमएस विजुअल स्टूडियो 2008, और मिनजीडब्ल्यू जो अनिवार्य रूप से कुछ जीसीसी आईआईआरसी भी हैं। उबंटू 10.04 के तहत कम से कम मेरा 4.4.3 मुझे त्रुटि देता है: "['टोकन' से पहले अपेक्षित प्राथमिक अभिव्यक्ति 'तो आपने किस कंपाइलर को ध्यान में रखा था? – math

+0

जीसीसी 4.5.एक्स और एमएसवीसी 2010. नवीनतम मिनजीडब्ल्यू 4.5 –

0

लागू अपनी कक्षा में operator<, कॉल:

maxSoFar = *(std::max_element(as.begin(), as.end())); 
+5

के साथ आता है मैं वास्तव में 'ऑपरेटर <' को लागू करने का शौक नहीं हूं इसलिए बस एक एल्गोरिदम काम करेगा। आम दोष यह है कि अर्थशास्त्र को अन्य परिस्थितियों में उम्मीद नहीं की जा सकती है और आप इसे एक से अधिक सदस्य के लिए नहीं कर सकते हैं। अपने शहर और समय क्षेत्र से दूरी वाले शहरों के एक वेक्टर पर विचार करें, यदि आप निकटतम खोजना चाहते हैं तो आप दूरी पर काम करने के लिए 'ऑपरेटर <' को अधिभारित करेंगे, यदि आप समय क्षेत्र के आंकड़े काम करना चाहते हैं तो आप समय क्षेत्र के लिए अधिभारित करेंगे, लेकिन आप दोनों नहीं मिल सकते हैं। एक शहर के लिए, छोटी की सबसे समझदार व्याख्या आबादी है, कोई अन्य चीज आश्चर्यजनक होगी। –

+0

@ डेविड: मैं मानता हूं कि किसी शहर के मामले में, ऑपरेटर <अर्थहीन है, लेकिन उपरोक्त उदाहरण दिया गया है, एक अभिन्न सदस्य के साथ - क्यों नहीं? मुझे लगता है कि सामान्य ज्ञान का एक अच्छा उपाय यहां आवश्यक है और जब तक कि आप किसी भी पूर्वकल्पित विचारों को तोड़ने न दें जब उपयोगकर्ता के पास उस ऑब्जेक्ट के बारे में है जिसे आप मॉडलिंग कर रहे हैं, तो मुझे व्यक्तिगत रूप से कोई नुकसान नहीं दिखता है ... मुझे विचार पसंद है बूंद लैम्ब्डा अभिव्यक्ति (उपर्युक्त प्रस्तावित) की, हालांकि, उन्हें बनाम एक सरल दृष्टिकोण जैसे कि एक मज़ेदार या ऑपरेटर का उपयोग करने के लिए थोड़ा सा उपर है .. – Nim

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

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