2013-07-18 7 views
8

std::min_elementoperator<(T,T) द्वारा या एक कस्टम भविष्यवाणी bool Pred(T,T) द्वारा परिभाषित किए गए सबसे छोटे तत्व को वापस कर देगा। क्या कोई ऐसा कार्य है जो तत्व लौटाता है जिसके लिए प्रोजेक्शन फ़ंक्शन f(T)->R न्यूनतम मान लेता है?क्या min_element का एक संस्करण है जो प्रक्षेपण कार्य करता है?

जाहिर है, मैं bool Pred(t1,t2) { return f(t1) < f(t2); } को परिभाषित कर सकता हूं लेकिन जब यह लैम्ब्डा है तो यह थोड़ा असुविधाजनक है।

+2

'f' के व्युत्पन्न की गणना करें। * ठीक है, मुझे पता है कि यह एक बुरा मजाक था * –

+0

लेकिन जब बैंक डेरिवेटिव्स का इस्तेमाल करते थे, तो यह एक वित्तीय संकट का कारण बनता है _ भी बुरा joke_: पी – MSalters

+1

यदि 'एफ' एक लैम्ब्डा है, तो आप इसे सी ++ 1y उच्च-आदेश में पास कर सकते हैं पॉलिमॉर्फिक लैम्बडा '[] (ऑटो एफ) {वापसी [] (ऑटो टी 1, ऑटो टी 2) {वापसी एफ (टी 1) <एफ (टी 2); }; } '(सोचो कि मुझे माता-पिता संतुलित हैं।) बेशक यह आपके जितना आवश्यक है उतनी गणना है। – Potatoswatter

उत्तर

4

क्यों न केवल एक जनरेटर जनरेटर less_by परिभाषित करें, जो लैम्ब्डा लेते हैं, एक मज़ेदार लौटाता है जो आपके लिए नौकरी करता है?

template <typename Proj> 
struct less_by_t { 
    Proj p; 

    template <typename T> 
    bool operator()(T const& a, T const& b) const { 
     return p(a) < p(b); 
    } 
}; 

template <typename Proj> 
less_by_t<Proj> less_by(Proj p) { 
    return {p}; 
} 
auto result = std::min_element(begin, end, less_by([](T const& x){return …;})); 
4

का उपयोग क्यों नहीं एक boost::transform_iterator एक विशेष कम विधेय लिख रहे हैं कि आप पुन: उपयोग कर सकते हैं अधिक Boost.Iterator library

auto Pred = [](some_value_type const& x){ /* your lambda here */ }; 
auto result = std::min_element(
    boost::make_transform_iterator(begin(container), Pred),  
    boost::make_transform_iterator(end(container), Pred) 
).base(); 
//^^^^^^^ <-- to get back an iterator to the original sequence 

इसका लाभ से (जो projection_iterator_adaptor कहा जाता था) अन्य सभी एल्गोरिदम के लिए यह दृष्टिकोण (उदाहरण के लिए std::max_element के लिए आपको एक विशेष अधिक भविष्यवाणी आदि की आवश्यकता होगी)।

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