Làm thế nào để sắp xếp với lambda?


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

Tôi muốn sử dụng hàm lambda để sắp xếp các lớp tùy chỉnh thay cho ràng buộc một phương thức cá thể. Tuy nhiên, đoạn mã trên mang lại lỗi:

lỗi C2564: 'const char *': chuyển đổi kiểu hàm thành kiểu dựng sẵn chỉ có thể nhận một đối số

Nó hoạt động tốt với boost::bind(&MyApp::myMethod, this, _1, _2).


Vectơ là một cấu trúc có chứa một số nguyên và hai chuỗi. Các tài sản ở đây sẽ là một số nguyên.
BTR

4
Chỉ cho chúng tôi một ví dụ nhỏ có thể biên dịch được .
GManNickG

Câu trả lời:


155

Hiểu rồi.

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

Tôi giả định rằng nó sẽ tìm ra rằng toán tử> trả về một bool (theo tài liệu). Nhưng rõ ràng nó không phải như vậy.


38
Thật là một crappy operator>, sau đó.
GManNickG

2
Những gì bạn đã viết cho đến nay có rất ít ý nghĩa. Nếu mProperty được coi là một int a.mProperty>b.mPropertychắc chắn sẽ mang lại một bool.
sellibitze

1
Sau đó, bạn hiểu sự nhầm lẫn của tôi. Tôi nghĩ rằng nó có thể là một cái gì đó kỳ lạ với VC10 Express của tôi (không có gói dịch vụ). Tôi đã chuyển dự án lên một máy có Visual Studio 2010 Team và nó hoạt động mà không có "-> bool".
BTR

8
Có nên như vậy operator<không operator>?
Không gian chiến tranh

8
Có, nó phải được <, cho thứ tự tăng dần tiêu chuẩn. Tôi đã chỉnh sửa câu trả lời để làm cho nó rõ ràng là một loại giảm dần nhưng rõ ràng bản chỉnh sửa của tôi không có ích và bị xóa sạch!
bánh kếp

18

Để nhiều mã, bạn có thể sử dụng nó như thế này:

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

Thay thế "vec" với lớp của bạn và đó là nó.


Làm thế nào câu trả lời của bạn là khác nhau sau đó BTR? Btw. bạn có thể sử dụng std :: started (vec) và std :: end (vec) để làm cho nó nhiều hơn c ++ 11.
Logman

Xin lỗi, tôi không biết làm thế nào tôi bỏ lỡ điều đó. Mắt tôi dừng lại ở bài Stephan. Xấu của tôi. (Tôi sửa đổi bài đăng sau khi đề xuất của bạn)
Adrian

5

Vấn đề có thể xảy ra với dòng "a.mProperty> b.mProperty" không? Tôi đã nhận được mã sau để làm việc:

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

Đầu ra là:

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

Vâng, một cái gì đó khó khăn với các thiết lập tôi đã được trên. Biên dịch trên máy tính xách tay của tôi mà không có nó chỉ tốt trên phiên bản Team của Visual Studio 2010. Điều gì đã khiến tôi băn khoăn về những gì tôi đã chuyển trở lại để ràng buộc và lỗi sẽ không biến mất. Tôi đã ở trên VC10 Express. Bọ cánh cứng?
BTR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.