c++11 Lambda函数与表示式

本文介绍了C++11中引入的Lambda表达式如何简化了标准库算法的使用,通过实例展示了不同Lambda表达式的语法和行为特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在调用C++标准程序库算法函数诸如算法函数诸如sort和find_if时候,第3个参数往往需要输入一个函数对象,既麻烦又冗赘,

还好C++11有了Lambda的支持,举例而言,程序员不用写像下面这样:

// 查找字符串长度是5的Data
struct Cmpare
{
	Cmpare(int n) : len_(n)
	{}

	bool operator()(const Data& d)
	{
		return (d.data_.length() == len_);
	}

private:
	int len_;
};
vector<Data>::iterator it = std::find_if(my_vec.begin(), my_vec.end(), Cmpare(5));
而可以用Lambda函数代替:

int find_len = 5;
it = std::find_if(my_vec.begin(), my_vec.end(), [find_len](const Data& d) {
	return (d.data_.length() == find_len);
});
Lambda函数体内需要什么变量,就在方括号中指明,方括号内容的含义:
[] // 沒有定义任何参数。使用未定义参数会导致错误。
[x, &y] // x 以传值方式传入,y 以传引用方式传入。
[&] // 任何被使用到的外部参数皆以引用方式使用。
[=] // 任何被使用到的外部参数皆以传值方式使用。
[&, x] // x 显式地以传值方式加以使用。其余参数以传入方式使用。
[=, &z] // z 显式地以引用方式加以使用。其余参数以传值方式使用。
在成员函数中指涉对象的 this 指针,必须要显式的传入 lambda 函数, 否则成员函数中的 lambda 函数无法使用任何该对象的变量或函数。
[this]() { this->SomePrivateMemberFunction(); };

[函数对象参数](操作符重载函数参数)->返回值类型{函数体}

vector<int> vec{1,2,3,4,5};
int A = 2;
int B = 3;
for_each(begin(vec), end(vec), [B](int &x){cout<<(x+B)<<endl;});   (1)
for_each(begin(vec), end(vec), [=](int &x){cout<<x*=(A+B)<<endl;}); (2)
for_each(begin(vec), end(vec), [=](int &x)->int{ return x*=(A+B);}); (3)

  • []内的参数指的是Lambda表达式可以取得的全局变量。(1)函数中的b就是指函数可以得到在Lambda表达式外的全局变量
  • 如果在[]中传入=的话,即是可以取得所有的外部变量,如(2)和(3)Lambda表达式
  • ()内的参数是每次调用函数时传入的参数
  • ->后加上的是Lambda表达式返回值的类型,如(3)中返回了一个int类型的变量
class CTest
{
public:
    CTest() : m_nData(20) { NULL; }
    void TestLambda()
    {
        vector<int> vctTemp;
        vctTemp.push_back(1);
        vctTemp.push_back(2);
        
        // 无函数对象参数,输出:1 2
        {
            for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });
        }
        
        // 以值方式传递作用域内所有可见的局部变量(包括this),输出:11 12
        {
            int a = 10;
            for_each(vctTemp.begin(), vctTemp.end(), [=](int v){ cout << v+a << endl; });
        }
        
        // 以引用方式传递作用域内所有可见的局部变量(包括this),输出:11 13 12
        {
            int a = 10;
            for_each(vctTemp.begin(), vctTemp.end(), [&](int v)mutable{ cout << v+a << endl; a++; });
            cout << a << endl;
        }
        
        // 以值方式传递局部变量a,输出:11 13 10
        {
            int a = 10;
            //注意:在lambda表达式中的 a 只是一个拷贝,添加mutable之后,可以修改a的值,但只是修改拷贝的a
            for_each(vctTemp.begin(), vctTemp.end(), [a](int v)mutable{ cout << v+a << endl; a++; });
            cout << a << endl;
        }
        
        // 以引用方式传递局部变量a,输出:11 13 12
        {
            int a = 10;
            for_each(vctTemp.begin(), vctTemp.end(), [&a](int v){ cout << v+a << endl; a++; });
            cout << a << endl;
        }
        
        // 传递this,输出:21 22
        {
            for_each(vctTemp.begin(), vctTemp.end(), [this](int v){ cout << v+m_nData << endl; });
        }
        
        // 除b按引用传递外,其他均按值传递,输出:11 12 17
        {
            int a = 10;
            int b = 15;
            for_each(vctTemp.begin(), vctTemp.end(), [=, &b](int v){ cout << v+a << endl; b++; });
            cout << b << endl;
        }
        
        // 操作符重载函数参数按值传递,输出:1 2
        {
            for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });
        }
        
        // 操作符重载函数参数按引用传递,输出:2 3
        {
            for_each(vctTemp.begin(), vctTemp.end(), [](int &v){ v++; cout<<v<<endl;});
        }
        
        
        // 空的Lambda表达式
        {
            [](){}();
            []{}();
        }
    }
    
private:
    int m_nData;
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值