C++11 lambda 快速理解

lambda 匿名函数
现阶段,编译器会将lanmbda匿名函数,转换为仿函数!故,stl算法完全可以使用lambda匿名函数。
auto b2 = [a, &b] (int c) -> int{ // a只读, b读写
    b = a + c;
    return a + c;
}(1000);


[var]   传值方式(只读)将变量传递到匿名函数中
[=]     父作用范围的所有变量以传值方式(只读),传递到匿名函数中(包括this)
[&var]  引用方式(读写)将变量传递到匿名函数中
[&]     父作用范围的所有变量以引用方式(读写),传递到匿名函数中(包括this)
[this]  传递当前this指针
[=,&var1,&var]  var1,var2以读写方式传递到匿名函数中,其他变量以只读方式传递到函数中
[&,var1,this]   var1,this以只读方式传递到函数中,其他变量以读写方式传递到函数中
        
捕捉非父作用范围的变量,或者非自变量(如,静态常量)等,都将导致编译错误。故可以看出,匿名函数

非动态函数,在编译期就定义了,故不会产生额外开销。


#include <iostream>
#include <typeinfo>

/*
 * 
 */
int main(void) {

    auto sum = [](int x, int y) -> int {return x + y;}; // 将创建的匿名函数赋值给sum
    
    std::cout << typeid(sum).name() << std::endl;
    
    int x = 10, y = 20;
    auto result = sum(x, y);
    
    std::cout << "result : " << result << std::endl;
    
    []{
        std::cout << "Done1" << std::endl;
    };
    // 只是声明了一个lambda函数,但未调用
    
    []{
        std::cout << "Done2" << std::endl;
    }();
    // 声明并调用一个lambda函数
    
    int a = 1, b = 10;
//    无法通过编译
//    [] {
//        return a + b; // 错误:‘a’未被捕获      错误:‘b’未被捕获
//    };
    [=] {       // [=] 通过捕捉,获得上下文的数据,所以可以使用变量a,b,但无法修改a,b
        return a + b;
    };
    
    std::cout << "b = " << b << std::endl;
    
    [&] (int c) { // [&] 捕捉上下文,并且可以修改a,b
        b = a + c;
    }(50);
    
    std::cout << "b = " << b << std::endl;
    
//    [&a, b] (int c) {   // a可以在函数体中被修改,而b不能
//        b = a + c;
//    }(1000);
    
    auto b2 = [a, &b] (int c) -> int{ // a只读, b读写
        b = a + c;
        return a + c;
    }(1000);
    
    std::cout << "b = " << b << "  b2 = " << b2 << std::endl;
    
    return 0;
}



#include <iostream>
#include <algorithm>
#include <list>

struct {
public:
    void operator()(const int& i) {
        std::cout << i << std::endl;
    }
} p1;
/*
 * 
 */
int main(void) {

    std::vector<int> ids{1, 2, 3, 4, 5};
    
    std::for_each(ids.begin(), ids.end(), p1);
    std::cout << "\n---------------------------" << std::endl;
    
    std::for_each(ids.begin(), ids.end(), [](int& i) {std::cout << i << std::endl; });

    return 0;
}




lambda与c++11线程的使用,非常的灵活,强大。

/* 
 * File:   main.cpp
 * Author: Vicky.H
 * Email:  eclipser@163.com
 */
#include <iostream>
#include <thread>

/*
 * 
 */
int main(void) {

    int i = 0;
    std::thread t(
            [&i]() {
                for (;;) {
                    std::this_thread::sleep_for(std::chrono::seconds(1));
                    i++;
                }
            }
    );

    t.detach();

    for (;;) {
        for (;;) {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            std::cout << "i = " << i << std::endl;
        }
    }

    return 0;
}


i = 1
i = 1
i = 2
i = 3
i = 5
i = 5
i = 7
i = 8




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值