Bagaimana cara menyortir lambda?

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

Saya ingin menggunakan fungsi lambda untuk mengurutkan kelas kustom sebagai pengganti metode instance. Namun, kode di atas menghasilkan kesalahan:

kesalahan C2564: 'const char *': konversi gaya-fungsi ke tipe bawaan hanya dapat mengambil satu argumen

Ini berfungsi dengan baik boost::bind(&MyApp::myMethod, this, _1, _2).

BTR
sumber
Vektor adalah sebuah struct yang berisi bilangan bulat dan dua string. Properti di sini akan berupa bilangan bulat.
BTR
4
Tunjukkan pada kami contoh kecil yang dapat dikompilasi .
GManNickG

Jawaban:

157

Mengerti.

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

Saya berasumsi akan mengetahui bahwa> operator mengembalikan bool (per dokumentasi). Namun ternyata tidak demikian.

BTR
sumber
39
Apa yang jelek operator>, kalau begitu.
GManNickG
2
Apa yang Anda tulis sejauh ini tidak masuk akal. Jika mProperty seharusnya menjadi int a.mProperty>b.mPropertypasti akan menghasilkan bool.
sellibitze
1
Maka Anda mengerti kebingungan saya. Saya pikir itu mungkin sesuatu yang aneh dengan VC10 Express saya (tidak ada paket layanan). Saya memindahkan proyek ke mesin dengan Visual Studio 2010 Team dan itu berhasil tanpa "-> bool".
BTR
8
Bukankah seharusnya operator<, tidak operator>?
Warpspace
8
Ya itu harus <, untuk pesanan naik standar. Saya mengedit jawaban untuk memperjelas bahwa itu adalah jenis yang menurun tetapi ternyata hasil edit saya tidak membantu dan terhapus!
panekuk
18

Untuk banyak kode, Anda dapat menggunakannya seperti ini:

#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;
}

Ganti "vec" dengan kelas Anda dan hanya itu.

Adrian
sumber
Bagaimana jawaban Anda berbeda dari BTR? Btw. Anda dapat menggunakan std :: begin (vec) dan std :: end (vec) untuk membuatnya lebih c ++ 11.
Logman
Maaf, saya tidak tahu bagaimana saya melewatkannya. Mataku berhenti di pos Stephan. Buruk saya (saya memodifikasi posting setelah saran Anda)
Adrian
5

Bisakah masalahnya dengan baris "a.mProperty> b.mProperty"? Saya mendapatkan kode berikut ini untuk berfungsi:

#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;
};

Outputnya adalah:

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
sumber
Ya, sesuatu yang kacau dengan pengaturan saya. Kompilasi pada laptop saya tanpa itu baik-baik saja pada edisi Tim Visual Studio 2010. Apa yang memberi saya petunjuk tentang apa yang saya beralih kembali ke mengikat dan kesalahan tidak akan hilang. Saya menggunakan VC10 Express. Bug?
BTR