จะเรียงด้วยแลมด้ายังไง?


138
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
แสดงให้เรามีขนาดเล็กcompilableตัวอย่างเช่น
GManNickG

คำตอบ:


159

เข้าใจแล้ว

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

ฉันคิดว่ามันคงคิดว่าตัวดำเนินการ> ส่งคืนบูล (ตามเอกสารประกอบ) แต่เห็นได้ชัดว่าไม่เป็นเช่นนั้น


40
อะไรเส็งเคร็งoperator>แล้ว
GManNickG

2
สิ่งที่คุณเขียนจนถึงตอนนี้ไม่ค่อยมีเหตุผล ถ้า mProperty ควรเป็น int a.mProperty>b.mPropertyจะให้ผล bool แน่นอน
sellibitze

1
แล้วคุณจะเข้าใจความสับสนของฉัน ฉันคิดว่ามันอาจจะแปลก ๆ กับ VC10 Express ของฉัน (ไม่มีเซอร์วิสแพ็ค) ฉันย้ายโปรเจ็กต์ไปยังเครื่องที่มี Visual Studio 2010 Team และทำงานได้โดยไม่มี "-> บูล"
BTR

8
มันไม่ควรoperator<ไม่ใช่operator>เหรอ?
Warpspace

8
ใช่ควรเป็น<สำหรับการเรียงลำดับจากน้อยไปหามากตามมาตรฐาน ฉันแก้ไขคำตอบเพื่อให้ชัดเจนว่าเป็นการเรียงลำดับจากมากไปหาน้อย แต่เห็นได้ชัดว่าการแก้ไขของฉันไม่เป็นประโยชน์และถูกล้าง!
pancake

19

หากต้องการโค้ดมากคุณสามารถใช้มันได้ดังนี้:

#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 คุณสามารถใช้ std :: begin (vec) และ std :: end (vec) เพื่อเพิ่ม c ++ 11
Logman

ขอโทษค่ะฉันไม่รู้ว่าพลาดไปได้อย่างไร สายตาของฉันหยุดที่ท่าสเตฟาน ฉันไม่ดี (ฉันแก้ไขโพสต์หลังจากคำแนะนำของคุณ)
Adrian

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,

ใช่มีบางอย่างที่น่าเบื่อกับการตั้งค่าที่ฉันเปิดอยู่ การคอมไพล์บนแล็ปท็อปของฉันโดยที่ไม่ได้ใช้ Visual Studio 2010 รุ่น Team สิ่งที่ทำให้ฉันต้องเปลี่ยนกลับไปผูกและข้อผิดพลาดจะไม่หายไป ฉันใช้ VC10 Express ข้อผิดพลาด?
BTR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.