lambda表达式提供了一种创建匿名函数对象的简洁方法。它们被定义为内联,通常是在使用的上下文中。语法通常看起来像这样:
<code class="c ">[capture list](parameter list) -> return type { function body };</code>
捕获列表:指定可以在lambda中访问周围范围的变量。选项包括:
[]
:什么也没捕获。[=]
:按值捕获周围范围中的所有变量。[&]
:通过引用捕获周围范围中的所有变量。[=, &var1, &var2]
:除了var1
和var2
以外,捕获所有通过参考捕获的数值。[var1, &var2]
:按值捕获var1
,并通过参考捕获var2
。->
之后明确指定,也可以由编译器隐式推导。例子:
<code class="c ">#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; std::for_each(numbers.begin(), numbers.end(), [](int x){ std::cout </int></algorithm></vector></iostream></code>
函数或功能对象是超载函数调用操作员( operator()
)的类。这允许将类的实例称为函数。
例子:
<code class="c ">#include <iostream> #include <vector> class Doubler { public: void operator()(int x) { std::cout numbers = {1, 2, 3, 4, 5}; Doubler doubler; std::for_each(numbers.begin(), numbers.end(), doubler); // Output: 2 4 6 8 10 std::cout </vector></iostream></code>
主要区别在于简洁和范围。对于简单操作,Lambda表达式更加紧凑,消除了定义单独类别的需求。它们在范围内也隐含地定义,使其非常适合一次性操作。另一方面,函子是明确定义的类,允许更复杂的逻辑,成员变量维护状态以及跨代码多个部分的潜在重复使用。 Lambdas通常的能力受到限制,超出周围范围捕获的状态的能力。函子可以在整个生命周期中具有成员变量来存储和操纵状态。
在以下情况时更喜欢lambda的表达
何时更喜欢函子:
不,您不能总是互换使用lambda表达式和函子。虽然它们都表示功能对象,但它们的功能也有所不同。 Lambdas的简洁性和内联性表现出色,非常适合简单,简单的操作。但是,他们缺乏全面课程的灵活性。函子,课程,提供对状态管理,成员功能和可重复性的更多控制,但它们引入了更多的样板代码。因此,选择取决于特定任务的复杂性和要求。具有状态操作的复杂功能更适合函子,而简单的一次性使用操作则受益于lambda的简洁性。
以上是如何在C中使用lambda表达式和函数对象(函子)?的详细内容。更多信息请关注PHP中文网其他相关文章!