欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > C++学习 - 01(lambda 表达式)

C++学习 - 01(lambda 表达式)

2024/11/18 12:38:57 来源:https://blog.csdn.net/believe666/article/details/143837741  浏览:    关键词:C++学习 - 01(lambda 表达式)

提示:本博客作为学习笔记,有错误的地方希望指正。

文章目录

  • 一、概述
  • 二、基本语法
  • 三、示例
    • 3.1、不捕获任何外部变量
    • 3.2、 按值捕获外部变量
    • 3.3、按引用捕获外部变量
    • 3.4、捕获所有外部变量
    • 3.5、捕获 this 指针
  • 四、应用场景
    • 4.1、使用 Lambda 表达式作为线程函数

一、概述

  C++ 中的 lambda 表达式是一种内联定义的小型匿名函数,可以用于各种需要函数对象的场合。lambda 表达式提供了一种简洁的方式来定义和使用函数对象,特别适用于需要临时定义函数的情况,如回调函数、排序算法中的比较函数等。

二、基本语法

  lambda 表达式的基本语法如下:

[capture-list] (parameter-list) -> return-type { function-body }
  • capture-list:捕获列表,用于捕获外部变量。
  • parameter-list:参数列表,定义函数的参数。
  • return-type:返回类型,可选,如果省略,编译器会自动推断返回类型。
  • function-body:函数体,包含具体的逻辑。

捕获列表
  捕获列表用于将外部变量捕获到 lambda 表达式中。常见的捕获方式有:

  • []:不捕获任何外部变量。
  • [=]:按值捕获所有外部变量。
  • [&]:按引用捕获所有外部变量。
  • [var]:按值捕获特定变量 var。
  • [&var]:按引用捕获特定变量 var。
  • [this]:捕获当前对象的 this 指针。

三、示例

3.1、不捕获任何外部变量

  auto 关键字用于自动类型推断,可以简化变量声明和初始化的过程。auto 关键字告诉编译器根据初始化表达式来推断变量的类型。这不仅使代码更简洁,还减少了手动指定类型时可能出现的错误。

#include <iostream>
int main()
{auto lambda = []() {std::cout << "hello world" << std::endl;};lambda();   // 调用 lambda 表达式return 0;
}

3.2、 按值捕获外部变量

int main ()
{int value = 42;auto lambda = [value](){std::cout << "captured value : " << value << std::endl;};lambda();   // 调用 lambda 表达式return 0;
}

3.3、按引用捕获外部变量

#include <iostream>int main() {int value = 42;auto lambda = [&value]() {value += 10;std::cout << "Modified value: " << value << std::endl;};lambda(); // 调用 lambda 表达式std::cout << "Final value: " << value << std::endl;return 0;
}

3.4、捕获所有外部变量

#include <iostream>int main() {int value1 = 42;int value2 = 100;auto lambda = [=]() {std::cout << "Value1: " << value1 << ", Value2: " << value2 << std::endl;};lambda(); // 调用 lambda 表达式return 0;
}

3.5、捕获 this 指针


class Myclass
{public:int value;Myclass(int val) : value(val){}void printValue() {auto lambda = [this]() {std::cout << "Value : " << value << std::endl;};lambda();}
};int main()
{Myclass obj(42);obj.printValue();return 0;
}

四、应用场景

  • 回调函数
    在事件驱动编程中,lambda 表达式常用于定义回调函数。
  • 标准库算法:
    在使用标准库算法(如 std::sort、std::for_each 等)时,lambda 表达式可以作为比较函数或操作函数。
  • 线程函数:
    在多线程编程中,lambda 表达式可以作为线程函数。

4.1、使用 Lambda 表达式作为线程函数

#include <iostream>
#include <thread>void createThreadWithLambda() {int value = 42;// 定义一个 lambda 表达式作为线程函数auto threadFunction = [value]() {std::cout << "Thread function: Value = " << value << std::endl;};// 创建线程std::thread t(threadFunction);// 等待线程结束t.join();
}int main() {createThreadWithLambda();return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com