如何处理一个 lambda?

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

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

Error C2564: ‘ const char *’: 函数风格的内置类型转换只能采用一个参数

它与 boost::bind(&MyApp::myMethod, this, _1, _2)一起工作得很好。

248752 次浏览

知道了。

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

我假设它会发现 > 操作符返回一个 bool (每个文档)。但显然事实并非如此。

“ 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,

你可以这样使用它:

#include<array>
#include<functional>
using namespace std;
int main()
{
array<int, 10> arr = { 1,2,3,4,5,6,7,8,9 };


sort(begin(arr),
end(arr),
[](int a, int b) {return a > b; });


for (auto item : arr)
cout << item << " ";


return 0;
}

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

#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

在 acm 竞赛中,我总是喜欢使用 lambda 对 struct 数组进行排序,如下所示:

struct item {
int a, b;
};


vector<item> q;


sort(q.begin(), q.end(), [&](item t1, item t2) {
return t1.a < t2.a;
});