概念
在C++中,Lambda表达式是一种匿名函数,它允许你在不预先定义函数的情况下快速创建函数对象。Lambda表达式通常用于编写简短的、一次性的函数,它们可以捕获和使用周围作用域中的变量。
Lambda表达式的基本语法如下:
[capture](parameters) -> return_type {
// function body
}
- capture:捕获列表,定义了Lambda表达式可以访问的外部变量。它可以是值捕获(通过复制)、引用捕获(通过引用)或两者的组合。
- parameters:参数列表,定义了Lambda表达式接受的参数,类似于普通函数的参数列表。
- return_type:返回类型,这是Lambda表达式返回的值的类型。在大多数情况下,这个可以被省略,因为编译器可以推断出来。
- function body:函数体,包含了Lambda表达式的代码。
Lambda表达式可以用于任何需要函数对象的地方,例如作为参数传递给算法,或者作为条件语句的结果。
以下是一些Lambda表达式的示例:
无参数和无返回值的Lambda
auto lambda = []() {
std::cout << "Hello, World!" << std::endl;
};
lambda(); // 输出 "Hello, World!"
有参数和有返回值的Lambda
auto sum = [](int a, int b) -> int {
return a + b;
};
int result = sum(5, 3); // result 是 8
捕获外部变量
int value = 10;
auto print_value = [value]() {
std::cout << "Value is " << value << std::endl;
};
print_value(); // 输出 "Value is 10"
引用捕获
int outer_var = 5;
auto modify_and_print = [&outer_var]() {
++outer_var;
std::cout << "Outer var is now " << outer_var << std::endl;
};
modify_and_print(); // 输出 "Outer var is now 6"
值捕获
int outer_var = 5;
auto print_captured = [outer_var]() {
std::cout << "Outer var was " << outer_var << std::endl;
};
print_captured(); // 输出 "Outer var was 5"
实战:
class Solution {
public:
int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
auto cmp = [&capital](int &a, int &b){
return capital[a] > capital[b];
};
priority_queue<int, vector<int>, less<int>> candidate;
priority_queue<int, vector<int>, decltype(cmp)> indexs(cmp);
for(int i = 0; i < capital.size(); i ++){
indexs.push(i);
}
while(k){
while(!indexs.empty() && w >= capital[indexs.top()]){ // 注意非空判断
candidate.push(profits[indexs.top()]);
indexs.pop();
}
if(candidate.empty()) break;
w += candidate.top();
candidate.pop();
k --;
}
return w;
}
};