2013-03-09 7 views
7

यह कैसे मैं एक कस्टम तुलनित्रमैं कंटेनर तुलना ऑपरेटर के लिए लैम्ब्डा का उपयोग कैसे कर सकता हूं?

priority_queue< int, vector<int>, greater<int> > third (myints,myints+4); 

    // using mycomparison: 
    priority_queue< int, vector<int>, mycomparison > q1; 
class mycomparison 
{ 
public: 
    bool operator() (const int& lhs, const int&rhs) const 
    { 
    return (lhs<rhs); 
    } 
}; 
    typedef priority_queue<int,vector<int>,mycomparison> q2; 

के रूप में इनबिल्ट समारोह या नया वर्ग का प्रयोग करेंगे है लेकिन मुझे आश्चर्य है कि अगर मैं वहाँ लैम्ब्डा कार्यों का उपयोग कर सकते हैं ..

+1

लैम्बडास मकसद हैं, जबकि कंटेनरों को एक मजेदार * प्रकार * की आवश्यकता होती है। आप 'decltype' के साथ कुछ करने में सक्षम हो सकते हैं (लेकिन मैं इसे MSVC2010 में काम करने की उम्मीद नहीं करता)। – Cameron

+2

हां, आप लैम्ब्डा का उपयोग कर सकते हैं, लेकिन लैम्ब्डा को इसके उपयोग की सबसे वैश्विक घोषणा के रूप में वैश्विक रूप में होना चाहिए जो इस उद्देश्य को हरा देता है और आम तौर पर गन्दा होता है। – GManNickG

उत्तर

19

पहले लैम्ब्डा परिभाषित:

auto compareFunc = [](int a, int b) { return a > b; }; 
अब जब आप

typedef priority_queue<int, vector<int>, decltype(compareFunc)> q2; 

:

फिर decltype का उपयोग q2 उपयोग करते हैं, समारोह में पारित:

q2 myQueue(compareFunc); 

असल में, priority_queue के रूप में यह 3 टेम्पलेट तर्क है, जबकि निर्माता है कि समारोह में ही करने के लिए एक सूचक लेता है एक समारोह के प्रकार लेता है।

+5

ध्यान दें कि इसके लिए एक वैश्विक चर के निर्माण की आवश्यकता है जिसमें 'q2' के समान दृश्यता होनी चाहिए। इसलिए यदि आपको हेडर में होने के लिए 'q2' की आवश्यकता है, तो आपको हेडर में होने के लिए इस ग्लोबल वैरिएबल की भी आवश्यकता है। यदि आप 'ऑटो' का उपयोग करना चाहते हैं तो दुनिया में सबसे आसान चीज़ नहीं है। –

+0

@ निकोलबोलस, आप क्या सुझाव देंगे? – Yola

+2

@Yola: मैं लैम्ब्डा की बजाय तुलना फ़ंक्शन के लिए एक स्ट्रक्चर का उपयोग करने का सुझाव दूंगा। यहां एक लैम्ब्डा का उपयोग करने का कोई फायदा नहीं है। –

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

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