利用Lambda表达式实现vector中pair/结构体的排序

众所周知,对于vector<pair<int, int> >若直接使用sort排序,会默认按照pair第一个关键字从小到大进行排序:

#include <bits/stdc++.h>using namespace std;int main()
{vector<pair<int, int> > p;p.push_back({1, 3});p.push_back({4, 2});p.push_back({2, 5});sort(p.begin(), p.end());for (auto i : p) {cout << i.first << " " << i.second;puts("");}return 0;
}

其输出结果为:
在这里插入图片描述

若想要更改其排序规则,可以考虑使用自定义cmp函数并添加在sort的第三个参数位置,

但使用 L a m b d a \rm Lambda Lambda表达式则更为简单。如下代码对pair按照第二个关键字从小到大排序。

#include <bits/stdc++.h>using namespace std;int main()
{vector<pair<int, int> > p;p.push_back({1, 3});p.push_back({4, 2});p.push_back({2, 5});sort(p.begin(), p.end(), [](const pair<int, int> &a, const pair<int, int> &b) {return a.second < b.second;});for (auto i : p) {cout << i.first << " " << i.second;puts("");}return 0;
}

其输出结果为:
在这里插入图片描述
与以下代码完全等价。

#include <bits/stdc++.h>using namespace std;bool cmp(const pair<int, int> &a, const pair<int, int> &b) {return a.second < b.second;
}
int main()
{vector<pair<int, int> > p;p.push_back({1, 3});p.push_back({4, 2});p.push_back({2, 5});sort(p.begin(), p.end(), cmp);for (auto i : p) {cout << i.first << " " << i.second;puts("");}return 0;
}

类似的,也可以按照第一个关键字与第二个关键字之和的大小来排序,对应的 L a m b d a \rm Lambda Lambda表达式应这样书写:

sort(p.begin(), p.end(), [](const pair<int, int> &a, const pair<int, int> &b) {return a.first + a.second < b.first + b.second;});

当然也可以写作

sort(p.begin(), p.end(), [&](const pair<int, int> a, const pair<int, int> b) {return a.first + a.second < b.first + b.second;});

其中[&]表示按引用的方式捕获变量。

更多的,结构体的自定义排序也可以采用 L a m b d a \rm Lambda Lambda表达式。例如:

struct Range
{int l, r;
}t[N];sort(t, t + n, [](const Range &a, const Range &b) {return a.r < b.r;});

等价于

struct Range
{int l, r;bool operator< (const Range &W)const{return r < W.r;}
}t[N];sort(t, t + n);

均为按照Range结构体的r从小到大排序。