C++11 -----从lambda说起

Lambda表达式
看了孟岩大大的一篇blog(http://blog.csdn.net/myan/article/details/5877305),偶决定先学一些主线内容:
①lambda表达式
②function/bind
③右值引用

本篇记录lambda表达式的应用:
Why Lambda:
Lambda表达式其实偶以前也接触过,只是一直用VS2005很少使用。某个大大说:不学好lambda表达式,别想看懂STL,BOOST,ACE源代码。偶不知道是真是假,除了STL小的连BOOST都没有使用过,ACE除了大学的时候蛋疼的配置过一次环境,然后敲入书中的第一个例子输出Log,然后就没有然后了。
在C/C++中没有函数嵌套定义,而lambda表达式正好弥补了这个缺陷。对与一些小的函数,通过lambda表达式来实现,增加了代码的紧密性,方便理解和阅读(执行效率会不会高一些呢?)。

What Lambda:
[=,&ref,val](int a,int b)mutable->double{语句;}(1,2);
①=:lambda可以访问外面的变量,但不可写
②&ref:引用外部变量,可读可写可返回(引用传递)
③val:表示值传递,可读不可写
④(int a ,int b)这没啥解释的
⑤mutable:表示非引用的值也可读可写,但不能返回
⑥->double决定块内部的返回值类型
⑦{语句;}函数块
⑧(1,2):取出函数指针指向地址的内容

[]  // 沒有定義任何變數。使用未定義變數會導致錯誤。
[x, &y] // x以傳值方式傳入(預設),y以傳參考方式傳入。
[&]   // 任何被使用到的外部變數皆隱式地以參考方式加以引用。
[=]   // 任何被使用到的外部變數皆隱式地以傳值方式加以引用。
[&, x]   // x顯示地以傳值方式加以引用。其餘變數以參考方式加以引用。
[=, &z]   // z顯示地以參考方式加以引用。其餘變數以傳值方式加以引用。


How Lambda:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
//lambda基础
void lambda_one();
//sort中lambda实例
void lambda_two();
//lambda函数递归
void lambda_three();

int main()
{
 lambda_one();
 lambda_two();
 lambda_three();
 getchar();
 return 0;
}


void lambda_one()
{
	cout<<endl <<"------------没有函数参数的lambda---------------------"<<endl;
	auto fun = [](){};
	auto fun1 = [](){cout <<"fun1"<<endl;};
	fun1();

	cout<<endl <<"------------for_each中使用简单的lambda----------------"<<endl; 
	std::vector<int>  v(3,5);
	for_each(v.begin(),v.end(),[](int num){ cout << num << "\t";});

	cout<<endl <<"------------设置lambda的返回值类型--------------------"<<endl; 
	cout <<[](double a, double b){return a + b;}(1.4,2.5)<<endl; 
	cout <<[](double a, double b)->int{return a + b;}(1.4,2.5)<<endl;

	cout<<endl <<"------------lambda中的传值----------------------------"<<endl;
	int x = 10;
	int y = 100;
	[=](double a, double b)mutable->int
	{
		cout <<"lambda:"<<(x = 100) << "\t" <<(y = 10)<<endl;
		return a + b;
	}(1.4,2.5);
	cout<<"main:" << x <<"\t"<< y <<endl;

	cout<<endl <<"------------lambda中的传引用--------------------------"<<endl;
	[&x,&y](double a, double b)mutable->int
	{
		cout <<"lambda:"<<(x = 100) << "\t" <<(y = 10)<<endl;
		return a + b;
	}(1.4,2.5);
	cout<<"main:" << x <<"\t"<< y <<endl;

	cout<<endl <<"------------lambda中的传引用和引用传递------------------"<<endl;
	//等号必须写在前面,或者也可以[x,&y].
	//=表示,除了&y,其他所有的外部变量都可以按照值传递进行访问。
	[=,&y](double a, double b)mutable->int
	{
		cout <<"lambda:"<<(x = 100) << "\t" <<(y = 10)<<endl;
		return a + b;
	}(1.4,2.5);
	cout<<"main:" << x <<"\t"<< y <<endl;
}

void lambda_two()
{
	//1.sort排序
	cout <<endl<<"------------sort排序中使用lambda------------------------"<<endl;
	int  a[8] = {6,8,3,4,9,2,7,1};
	sort(begin(a),end(a),[](const int &a ,const int &b)->bool{return a < b;});
	for_each(begin(a),end(a),[](const int &num){cout << num << "\t";});

	cout <<endl<<"---------------------------------------------------------"<<endl;

}

void lambda_three()
{
//2. (lambda递归)3个数返回最大的两个数的和
	cout <<endl<<"------------lambda递归-----------------------------------"<<endl;
	function<int(int,int,int)> f = [&f](int a,int b,int c)->int
	{
		if (a<= b && a <= c)
		{
		return b + c;
		}
		return f(b,c,a);
	};
	cout << f(4,5,6)<<endl;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值