【c++11】 lamda表达式

本文深入探讨了C++中的Lambda表达式,包括其标准样式、如何带参数使用,以及[]中不同值的作用,如外部变量传递、值传递与引用传递的区别。通过具体示例,读者可以了解到Lambda表达式的灵活应用。

1.标准样式
[](CString itUrl)->bool {        
        
    }

例子:
不带参数:
auto fun_helloworld = []()->void{
  std::cout << "hello world" << std::endl;
};

fun_helloworld();

带一个参数:
auto fun_helloworld = [](std::string aa)->void{
  std::cout << aa << std::endl;
};

fun_helloworld("hello world");


2.[]中几个值介绍
auto findUrlFun = [=](CString itUrl)->bool {        
        auto itUrlOrigin = GetOriginImageFileUrl(itUrl.GetBuffer());
        return itUrlOrigin.CompareNoCase(urlOrigin) == 0 ? true : false;
    };

(1)[],什么都不传

for (int i=0; i<10; ++i)
{
    auto fun_helloworld = [](std::string aa)->void {
        std::cout <<  aa << std::endl;
    };

    fun_helloworld("haha");
}


(2)[]中传外部变量,如this
例子:
for (int i=0; i<10; ++i)
{
    auto fun_helloworld3 = [i](std::string aa)->void {
        std::cout <<  i << "---" << aa << std::endl;
    };

    fun_helloworld3("haha");
}

(3)[=],"="是值传递即只能使用外部变量,不能改变值
for (int i=0; i<10; ++i)
{
    auto fun_helloworld3 = [=](std::string aa)->void {
        std::cout <<  i << "---" << aa << std::endl;
    };

    fun_helloworld3("haha");
}

(4)[&],"&"是引用传递,即可以在内部改变外部变量
for (int i=0; i<10; ++i)
{
    auto fun_helloworld3 = [&](std::string aa)->void {
        std::cout <<  i << "---" << aa << std::endl;
        if (i == 9)
        {
            i = 0;
        }
    };

    fun_helloworld3("haha");
}


[]中现在经常看到过this,&,=
说明:=意思是值传递,只能使用外部变量,不能改变
&是引用传递,即可以在内部改变外部变量

 

 

### C++ Lambda 表达式概述 Lambda表达式提供了一种简洁的方法来创建匿名函数对象。这些匿名函数可以在定义的地方立即使用,也可以作为参数传递给其他函数或存储起来供以后调用。 #### 基本语法结构 一个典型的lambda表达式的语法如下: ```cpp [capture](parameters) -> return_type { // 函数体 } ``` - **捕获列表 (`capture`)**:用于指定哪些外部变量可以被lambda访问以及如何访问它们。 - **参数列表 (`parameters`)**:类似于常规函数的参数声明。 - **返回类型 (`return_type`)**:可选部分;如果省略,默认推断为 `auto` 类型。 - **函数体**:执行的具体逻辑代码块[^1]。 #### 捕获列表详解 捕获列表允许lambda内部使用其作用域之外定义的名字。常见的形式有: - `[=]`:按值复制所有局部变量。 - `[&]`:通过引用捕捉所有局部变量。 - `[this]`:仅当成员函数内定义时有效,表示当前实例指针。 - `[var]` 或者 `[&var]` :单独捕捉特定变量 var ,前者传值后者传址。 #### 实际应用案例 下面的例子展示了如何利用lambda表达式简化回调机制并将其存入标准库容器中以便后续处理: ```cpp #include <iostream> #include <vector> #include <functional> // For std::function int main() { // 创建一个保存多个整数到整数映射关系的向量 std::vector<std::function<int(int)>> operations; // 向operations添加两个不同的操作 operations.push_back([](int x){ return x + 1; }); operations.push_back([](int y){ return y * 2; }); // 应用每个已注册的操作于输入数值,并打印结果 for (const auto& op : operations){ std::cout << "Operation result: " << op(5) << "\n"; } return 0; } ``` 此程序会依次输出加一和乘二的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin--你不知道的事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值