एक लंबोदर के साथ कैसे सुलझाएं?


136
sort(mMyClassVector.begin(), mMyClassVector.end(), 
    [](const MyClass & a, const MyClass & b)
{ 
    return a.mProperty > b.mProperty; 
});

मैं एक उदाहरण विधि को बांधने के स्थान पर कस्टम कक्षाओं को सॉर्ट करने के लिए एक लंबो फ़ंक्शन का उपयोग करना चाहता हूं। हालाँकि, उपरोक्त कोड त्रुटि उत्पन्न करता है:

त्रुटि C2564: 'const char *': एक फंक्शनल स्टाइल रूपांतरण में बिल्ट-इन टाइप केवल एक तर्क ले सकता है

इसके साथ ठीक काम करता है boost::bind(&MyApp::myMethod, this, _1, _2)


वेक्टर एक संरचना का होता है जिसमें एक पूर्णांक और दो तार होते हैं। यहाँ संपत्ति एक पूर्णांक होगी।
BTR

4
हमें एक छोटा सा संकलन उदाहरण दें।
GMNNGG

जवाबों:


157

समझ गया।

sort(mMyClassVector.begin(), mMyClassVector.end(), 
    [](const MyClass & a, const MyClass & b) -> bool
{ 
    return a.mProperty > b.mProperty; 
});

मुझे लगा कि यह पता चलेगा कि> ऑपरेटर एक बूल (प्रति प्रलेखन) लौटा है। लेकिन स्पष्ट रूप से ऐसा नहीं है।


39
क्या भद्दा है operator>, फिर।
GManNickG

2
आपने अभी तक जो कुछ लिखा है, वह थोड़ा समझ में आता है। अगर mProperty माना जाता है कि एक int a.mProperty>b.mPropertyनिश्चित रूप से एक बूल उपज देगा।
सेलिबिट्ज़

1
तब तुम मेरी उलझन को समझते हो। मुझे लगता है कि यह मेरे VC10 एक्सप्रेस (कोई सर्विस पैक) के साथ कुछ अजीब हो सकता है। मैंने विज़ुअल स्टूडियो 2010 टीम के साथ एक मशीन पर प्रोजेक्ट को स्थानांतरित किया और यह "-> बूल" के बिना काम किया।
BTR

8
यह नहीं होना चाहिए operator<, नहीं operator>?
वॉरस्पेस

8
हाँ, यह <मानक आरोही क्रम के लिए होना चाहिए । मैंने इसका उत्तर संपादित किया यह स्पष्ट करने के लिए कि यह एक अवरोही प्रकार था, लेकिन जाहिर तौर पर मेरा संपादन निष्कलंक था और मिटा दिया गया!
पैनकेक

18

बहुत कोड के लिए, आप इसे इस तरह से उपयोग कर सकते हैं:

#include<array>
#include<functional>

int main()
{
    std::array<int, 10> vec = { 1,2,3,4,5,6,7,8,9 };

    std::sort(std::begin(vec), 
              std::end(vec), 
              [](int a, int b) {return a > b; });

    for (auto item : vec)
      std::cout << item << " ";

    return 0;
}

"Vec" को अपनी कक्षा से बदलें और यह बात है।


आपका जवाब कैसे अलग है तो BTR? Btw। आप इसे और अधिक c ++ 11 बनाने के लिए std :: start (vec) और std :: end (vec) का उपयोग कर सकते हैं।
लोगमैन

क्षमा करें, मुझे नहीं पता कि मैं कैसे चूक गया। मेरी नजर स्टेपहान पोस्ट पर रुकती है। मेरा बुरा। (मैं आपके सुझावों के बाद पोस्ट को संशोधित करता हूं)
एड्रियन

5

क्या समस्या "a.mProperty> b.mProperty" लाइन के साथ हो सकती है? मैंने काम करने के लिए निम्न कोड प्राप्त किया है:

#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream>
#include <sstream>

struct Foo
{
    Foo() : _i(0) {};

    int _i;

    friend std::ostream& operator<<(std::ostream& os, const Foo& f)
    {
        os << f._i;
        return os;
    };
};

typedef std::vector<Foo> VectorT;

std::string toString(const VectorT& v)
{
    std::stringstream ss;
    std::copy(v.begin(), v.end(), std::ostream_iterator<Foo>(ss, ", "));
    return ss.str();
};

int main()
{

    VectorT v(10);
    std::for_each(v.begin(), v.end(),
            [](Foo& f)
            {
                f._i = rand() % 100;
            });

    std::cout << "before sort: " << toString(v) << "\n";

    sort(v.begin(), v.end(),
            [](const Foo& a, const Foo& b)
            {
                return a._i > b._i;
            });

    std::cout << "after sort:  " << toString(v) << "\n";
    return 1;
};

आउटपुट है:

before sort: 83, 86, 77, 15, 93, 35, 86, 92, 49, 21,
after sort:  93, 92, 86, 86, 83, 77, 49, 35, 21, 15,

हां, मैं जिस सेटअप पर था, उसके साथ कुछ पेचीदा था। विजुअल स्टूडियो 2010 के टीम संस्करण पर इसके बिना मेरे लैपटॉप पर संकलित करना। मुझे उस चीज़ में क्या मिला जिसे मैं बांधने के लिए वापस आ गया और त्रुटि दूर नहीं होगी। मैं VC10 एक्सप्रेस पर था। बग?
BTR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.