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可以编写更简洁、更表达力的代码。

更多推荐