Как отсортировать с помощью лямбды?

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).

вопрос задан 25.02.2011
BTR
1696 репутация

3 ответов


  • 98 рейтинг

    Понял.

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

    Я предполагал, что это выяснит, что & gt; оператор вернул бул (согласно документации). Но, видимо, это не так.

    ответ дан BTR, с репутацией 1696, 25.02.2011
  • 4 рейтинг

    Чтобы много кода, вы можете использовать его так:

    #include
    #include
    
    int main()
    {
        std::array 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" на ваш класс и все.

    ответ дан Adrian, с репутацией 170, 8.11.2017
  • 3 рейтинг

    Может ли проблема быть с "а. mProperty & gt; б. Собственность "линия"? Я получил следующий код для работы:

    #include 
    #include 
    #include 
    #include 
    #include 
    
    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 VectorT;
    
    std::string toString(const VectorT& v)
    {
        std::stringstream ss;
        std::copy(v.begin(), v.end(), std::ostream_iterator(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,
    
    ответ дан Stephan, с репутацией 693, 26.02.2011