Lambda 排序
本课属于 Coddy C++ 学习旅程的“逻辑与流程”单元。第 47 课,共 56 课。
C++ 标准库提供了一个强大的函数,名为 std::sort,它来自 <algorithm> 头文件,可以对 vector 等容器进行排序。
默认情况下,std::sort 会按升序(从小到大)排列元素。不过,你可以提供一个 lambda 表达式来定义元素的比较方式,从而自定义这种行为:
#include <vector>
#include <algorithm>
std::vector<int> numbers = {5, 2, 8, 1, 9};
// 使用 lambda 按降序排序
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // 如果 a 应排在 b 前面,就返回 true
});这个 lambda 接收两个参数,分别表示要比较的元素。如果第一个元素在排序结果中应排在第二个元素之前,就返回 true。对于降序排序,当 a > b 时返回 true,这样较大的数字就会排在前面。
这展示了 lambda 如何让你无需编写单独的比较函数,就能轻松自定义标准库函数,并将排序逻辑放在需要的位置。
挑战
简单编写一个程序,使用 Lambda 表达式和 std::sort 演示自定义排序。本挑战将检验你对如何使用 Lambda 函数定义自定义比较逻辑来排序容器的理解。
将提供以下输入:
- 一个整数
n,表示 vector 中的元素数量 n个整数,表示要排序的元素- 一个字符
order,表示排序顺序(A表示升序,D表示降序)
你的程序应当:
- 创建一个
std::vector<int>,并用输入的数字填充它 - 使用
<algorithm>头文件中的std::sort和 Lambda 表达式对 vector 排序 - Lambda 应接收两个整数参数,并返回一个布尔值
- 根据表示顺序的字符,在 Lambda 中实现相应的比较逻辑
- 将排序后 vector 中的每个元素单独输出一行
排序行为应为:
- 如果
order是A:按升序排序(从小到大) - 如果
order是D:按降序排序(从大到小)
请使用以下确切的输出格式:
[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]请记住,std::sort 接收三个参数:起始迭代器、结束迭代器和比较函数。迭代器请使用 vector.begin() 和 vector.end()。Lambda 比较函数应在第一个参数应排在排序结果中的第二个参数之前时返回 true。升序时,返回 a < b;降序时,返回 a > b。
亲手试试
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// 读取输入
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; i++) {
cin >> numbers[i];
}
char order;
cin >> order;
// TODO: 在下方编写你的代码
// 使用 std::sort 和 lambda 表达式对向量排序
// 根据 order 字符决定排序方式(A 表示升序,D 表示降序)
// 输出排序后的元素
for (int num : numbers) {
cout << num << endl;
}
return 0;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C++ 在线编译器