如何用 lambda 排序?

Posted

技术标签:

【中文标题】如何用 lambda 排序?【英文标题】:How to sort with a lambda? 【发布时间】:2011-07-04 14:45:08 【问题描述】:
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) 可以正常工作。

【问题讨论】:

向量是一个包含一个整数和两个字符串的结构。这里的属性是一个整数。 给我们展示一个可编译的小例子。 【参考方案1】:

代码太多,可以这样使用:

#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 替换为您的班级,就是这样。

【讨论】:

【参考方案2】:

您可以像这样对数组进行排序:

#include <bits/stdc++.h>
using namespace std;
int main() 
    int q[] = 1, 3, 5, 7, 9, 2, 4, 6, 8 ,10;
    sort(q, q + 10, [&](int A, int B)  return A < B; );
    for (int i = 0; i < 10; i++)
        cout << q[i] << ' ';
    return 0;

before sort: 1 3 5 7 9 2 4 6 8 10
after sort: 1 2 3 4 5 6 7 8 9 10 

【讨论】:

【参考方案3】:

问题可能出在“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上。错误? 让它更长,这就是为什么 op 想要使用 lambda【参考方案4】:

知道了。

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

我认为它会发现 > 运算符返回一个布尔值(根据文档)。但显然并非如此。

【讨论】:

到目前为止您所写的内容毫无意义。如果 mProperty 应该是一个 int a.mProperty&gt;b.mProperty 肯定会产生一个 bool。 那你就明白我的困惑了。我认为我的 VC10 Express(无服务包)可能有些奇怪。我将项目移到了带有 Visual Studio 2010 Team 的机器上,它在没有“-> bool”的情况下工作。 不应该是operator&lt;,而不是operator&gt;吗? 是的,它应该是&lt;,用于标准升序。我编辑了答案以明确它是降序排序,但显然我的编辑没有帮助并被抹去! 我刚刚在 GCC 5.3.0 中尝试过,不需要 -&gt; bool 部分。

以上是关于如何用 lambda 排序?的主要内容,如果未能解决你的问题,请参考以下文章

请教如何用python按字母顺序排序英文名字但是不可以用sort函数

如何用VBA实现冒泡排序?

如何用示例向非技术测试人员解释排序(数字、字典和排序规则)?

如何用sort对结构体进行排序

按日期排序对象列表,其中对象没有名称

如何用python实现各种数据结构