如何用lambda排序?


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

我想使用lambda函数对自定义类进行排序,以代替绑定实例方法。但是,上面的代码会产生错误:

错误C2564:“ const char *”:将函数样式转换为内置类型只能使用一个参数

与配合使用效果很好boost::bind(&MyApp::myMethod, this, _1, _2)


向量是包含整数和两个字符串的结构。这里的属性将是一个整数。
BTR

4
向我们展示一个小的可编译示例。
GManNickG 2011年

Answers:


155

得到它了。

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

我以为可以弄清楚>运算符返回了布尔值(根据文档)。但显然并非如此。


38
那真是cr脚operator>
GManNickG 2011年

2
到目前为止,您所写的内容毫无意义。如果mProperty应该是一个int,a.mProperty>b.mProperty则肯定会产生布尔值。
sellibitze 2011年

1
然后,您了解我的困惑。我认为VC10 Express(无Service Pack)可能有些奇怪。我将项目移至装有Visual Studio 2010 Team的计算机上,并且该项目无需使用“-> bool”即可工作。
BTR

8
它不应该是operator<,不operator>
Warpspace 2013年

8
是的<,对于标准升序,应该为。我编辑了答案以使其清楚,这是降序排列,但显然我的编辑没有帮助,被抹掉了!
煎饼

18

对于很多代码,您可以像这样使用它:

#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有何不同?顺便说一句。您可以使用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团队版的情况下,在没有它的情况下在我的笔记本电脑上进行编译就可以了。我当时使用的是VC10 Express。虫子?
BTR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.