题目
编写程序,使用 std::sort 结合 C++11 Lambda 表达式实现灵活的多维条件排序。深入掌握 Lambda 的四种捕获模式(值捕获 [=]、引用捕获 [&]、显式变量捕获 [threshold] 与无状态捕获 []);演示利用外部动态配置的阈值,将数组元素按“距离阈值的绝对差距由近及远”排序。
输入格式:无需外部输入。
输出格式:输出使用不同捕获机制 Lambda 排序后的数组序列。
数据范围与约定:Lambda 闭包原理、函数对象生成与 STL 算法适配。
思路与算法
1. Lambda 的底层本质
C++ 编译器在底层会将每个 Lambda 表达式自动转换为一个匿名的仿函数结构体(Functor),重载了 operator()。捕获列表本质上就是该仿函数结构体的私有成员变量。
2. 引用捕获悬垂风险
在局部同步使用 std::sort 时传引用 [&] 是安全的;但若将 Lambda 作为异步回调或存储时,引用捕获的外部局部变量若被析构,会导致致命的野引用。
3. 内省优化std::sort 是高度优化的内省排序(Introsort):先执行快速排序(Quick Sort),当递归深度超过阈值时切换为堆排序(Heap Sort)防最坏情况,区间较小时切换为插入排序(Insertion Sort)。
完整程序
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
int main() {
std::vector<int> nums = {15, 3, 9, 24, 8, 11, 30};
// 1. 无状态 Lambda:标准降序排序
std::sort(nums.begin(), nums.end(), [](int a, int b) {
return a > b;
});
std::cout << "1. 无状态 Lambda 降序排序: ";
for (int x : nums) std::cout << x << " ";
std::cout << "\n";
// 2. 带闭包外部变量捕获:按距离目标基准值的绝对偏差升序排
int target = 10;
std::sort(nums.begin(), nums.end(), [target](int a, int b) {
int diffA = std::abs(a - target);
int diffB = std::abs(b - target);
if (diffA != diffB) {
return diffA < diffB; // 距离基准值近的排前面
}
return a < b; // 偏差相同时较小值排前面
});
std::cout << "2. 闭包捕获 target = 10,按偏离距离排序: ";
for (int x : nums) std::cout << x << " ";
std::cout << "\n";
return 0;
}运行示例
输出:
1. 无状态 Lambda 降序排序: 30 24 15 11 9 8 3
2. 闭包捕获 target = 10,按偏离距离排序: 9 11 8 15 3 24 30