通过lambda表达式,我们可以以简洁、灵活的方式定义一个匿名函数。在C++11标准中,引入了lambda表达式语法,可以帮助我们在C++中更加方便地使用匿名函数。下面是关于C++ lambda表达式使用的完整攻略。
1. lambda 表达式的基本语法
lambda表达式的一般形式为:
[capture list](parameters) mutable(optional) exception attribute -> return_type { function_body }
- 参数列表(parameters):类似于函数的参数列表,可以包含多个参数,以逗号隔开。
- 可变性指示符(mutable):表示lambda表达式中的代码是否能够修改其所捕获的值,在默认情况下,lambda表达式不会修改捕获的变量。
- 捕获列表(capture list):表示lambda表达式所捕获的变量。
- 返回类型(return type):表示lambda表达式的返回值类型。
- 函数体(function body):包含lambda表达式的执行代码。
2. lambda 表达式的基本使用
下面是一个简单的示例,展示如何使用lambda表达式定义一个匿名函数:
auto f = [](int x, int y) { return x + y; };
int res = f(2, 3); // res 的值为 5
我们可以对lambda表达式进行赋值,然后像普通的函数一样进行调用。在这个例子中,lambda表达式定义了一个以x和y为参数的函数,返回x+y。定义lambda表达式时,可以使用任意支持的语法来指定函数体,只要保证函数体可以返回类型正确的值即可。
3. lambda 表达式捕获变量
在lambda表达式中,捕获变量是一个很重要的概念,它允许我们访问在lambda表达式范围外的变量。捕获的变量可以是全局变量、静态变量、局部变量、形参以及this指针。在捕获变量时,lambda表达式通过以下方式对捕获的变量进行区分:
- 按值捕获:以值传递方式捕获变量。
- 引用捕获:以引用传递方式捕获变量。
以下示例展示了lambda表达式中的值捕获和引用捕获的区别:
int x = 2;
auto f1 = [x]() { return x; }; // 值捕获,x 的值被复制
auto f2 = [&x]() { return x; }; // 引用捕获,x 的引用被传递
x = 5;
int res1 = f1(); // res1 的值为 2
int res2 = f2(); // res2 的值为 5
在这个示例中,我们定义了一个变量x,然后定义了两个lambda表达式,一个以值捕获方式,一个以引用捕获方式捕获变量x。接着,我们改变了变量x的值,然后调用两个lambda表达式,它们分别返回新的和旧的变量x的值。值捕获的lambda表达式得到的是捕获时变量的值,而引用捕获的lambda表达式得到的是变量被修改后的值。
4. lambda 表达式使用示例
下面是两个使用lambda表达式的示例:
4.1 排序算法
在排序算法中,我们可以使用lambda表达式作为排序算法的比较函数。以下是一个以lambda表达式为比较函数的快速排序算法示例:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void quicksort(vector<int>& vec) {
if (vec.size() <= 1)
return;
else {
int pivot = vec[vec.size() / 2];
vector<int> left;
vector<int> right;
vector<int> pivot_list;
for (int i:vec) {
if (i < pivot) {
left.push_back(i);
}
else if (i > pivot) {
right.push_back(i);
}
else {
pivot_list.push_back(i);
}
}
quicksort(left);
quicksort(right);
vec.clear();
vec.insert(vec.end(), left.begin(), left.end());
vec.insert(vec.end(), pivot_list.begin(), pivot_list.end());
vec.insert(vec.end(), right.begin(), right.end());
}
}
int main() {
vector<int> vec {5, 3, 9, 7, 2, 4, 1, 8, 6};
auto cmp = [](int a, int b) { return a < b; }; // lambda表达式作为比较函数
sort(vec.begin(), vec.end(), cmp);
for (auto i:vec) {
cout << i << " ";
}
cout << endl;
return 0;
}
在这个示例中,我们定义了一个函数quicksort,它以vector作为参数,使用lambda表达式作为比较函数进行排序。在主函数中,我们定义了一个vector,然后定义了一个lambda表达式作为比较函数传递给sort函数,输出已排序的vector。
4.2 使用STL算法和lambda表达式
在使用STL算法时,我们通常需要使用函数对象(functor),例如less、greater等。在C++11中,我们可以使用lambda表达式代替函数对象,使代码更加清晰。以下是一个示例,展示了如何使用lambda表达式和for_each算法对vector进行求和:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> vec {1, 2, 3, 4, 5};
int sum = 0;
auto add_sum = [&sum](int n) { sum += n; }; // lambda表达式作为函数对象
for_each(vec.begin(), vec.end(), add_sum);
cout << "Sum is " << sum << endl;
return 0;
}
在这个示例中,我们定义了一个vector,然后定义了一个lambda表达式作为函数对象,使用for_each算法对vector中所有元素进行了求和。在lambda表达式中,我们捕获了变量sum,并将每个元素加入sum中。最后,我们输出了求和结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++精要分析lambda表达式的使用 - Python技术站