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


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.


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.


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,

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.