C++lambda表达式与函数式编程
C++lambda表达式与函数式编程
lambda表达式是C++11引入的匿名函数对象,提供简洁的函数定义语法。lambda可以捕获外部变量,支持函数式编程风格,是STL算法的重要伙伴。
基本lambda语法包括捕获列表、参数列表和函数体。
#include
#include
#include
#include
void lambda_syntax() {
auto simple = [] {
std::cout << "Simple lambda\n";
};
simple();
auto add = [](int a, int b) -> int {
return a + b;
};
std::cout << "3 + 4 = " << add(3, 4) << "\n";
auto square = [](int x) { return x * x; };
std::cout << "5 squared = " << square(5) << "\n";
}
捕获列表控制外部变量的访问方式。
void capture_modes() {
int x = 10, y = 20;
auto by_val = [x, y]() {
return x + y;
};
std::cout << "By value: " << by_val() << "\n";
auto by_ref = [&x, &y]() {
x += 5;
y += 5;
};
by_ref();
std::cout << "After by_ref: " << x << ", " << y << "\n";
x = 10;
y = 20;
auto all_by_val = [=]() { return x + y; };
auto all_by_ref = [&]() {
x *= 2;
y *= 2;
};
all_by_ref();
std::cout << "After all_by_ref: " << x << ", " << y << "\n";
}
mutable允许修改按值捕获的变量。
void mutable_lambda() {
int counter = 0;
auto increment = [counter]() mutable {
++counter;
std::cout << "Lambda count: " << counter << "\n";
};
increment();
increment();
increment();
std::cout << "Original: " << counter << "\n";
}
lambda与STL算法结合。
void lambda_with_algorithms() {
std::vector numbers = {5, 2, 8, 1, 9, 3, 7, 4, 6};
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b;
});
std::cout << "Sorted desc: ";
for (int n : numbers) std::cout << n << " ";
std::cout << "\n";
auto even_count = std::count_if(numbers.begin(), numbers.end(),
[](int n) { return n % 2 == 0; });
std::cout << "Even count: " << even_count << "\n";
std::vector doubled;
std::transform(numbers.begin(), numbers.end(), std::back_inserter(doubled),
[](int n) { return n * 2; });
int threshold = 5;
auto it = std::find_if(numbers.begin(), numbers.end(),
[threshold](int n) { return n < threshold; });
if (it != numbers.end()) {
std::cout << "First < " << threshold << ": " << *it << "\n";
}
}
泛型lambda使用auto参数。
void generic_lambda() {
auto print = [](const auto& value) {
std::cout << value << "\n";
};
print(42);
print(3.14);
print("Hello C++");
auto add = [](auto a, auto b) { return a + b; };
std::cout << "Int: " << add(1, 2) << "\n";
std::cout << "Double: " << add(1.5, 2.5) << "\n";
std::cout << "String: " << add(std::string("a"), std::string("b")) << "\n";
}
初始化捕获支持移动操作。
void init_capture() {
auto ptr = std::make_unique(42);
auto lambda = [p = std::move(ptr)]() {
std::cout << "Value: " << *p << "\n";
};
lambda();
auto counter = [n = 0]() mutable {
return ++n;
};
std::cout << "Counter: " << counter() << "\n";
std::cout << "Counter: " << counter() << "\n";
}
lambda作为回调函数。
class Button {
std::function handler_;
public:
void set_handler(std::function f) {
handler_ = f;
}
void click() {
if (handler_) handler_();
}
};
void callback_demo() {
Button btn;
int click_count = 0;
btn.set_handler([&click_count]() {
std::cout << "Clicked " << ++click_count << " times\n";
});
btn.click();
btn.click();
btn.click();
}
递归lambda使用std::function。
void recursive_lambda() {
std::function factorial = [&](int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
};
std::cout << "5! = " << factorial(5) << "\n";
std::cout << "8! = " << factorial(8) << "\n";
}
lambda的闭包类型是唯一的匿名类型。
void lambda_types() {
auto l1 = [](int x) { return x; };
auto l2 = [](int x) { return x; };
std::cout << "l1 == l2: " << std::is_same::value << "\n";
}
lambda与异步编程。
void async_lambda() {
auto future = std::async([]() {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
return 42;
});
std::cout << "Result: " << future.get() << "\n";
}
lambda表达式是现代C++中最常用的特性之一,掌握lambda可以编写更简洁、更表达力的代码。
更多推荐


所有评论(0)