标签:
看了孟岩大大的一篇blog(http://blog.csdn.net/myan/article/details/5877305),偶决定先学一些主线内容:
①lambda表达式
②function/bind
③右值引用
Lambda表达式其实偶以前也接触过,只是一直用VS2005很少使用。某个大大说:不学好lambda表达式,别想看懂STL,BOOST,ACE源代码。偶不知道是真是假,除了STL小的连BOOST都没有使用过,ACE除了大学的时候蛋疼的配置过一次环境,然后敲入书中的第一个例子输出Log,然后就没有然后了。
在C/C++中没有函数嵌套定义,而lambda表达式正好弥补了这个缺陷。对与一些小的函数,通过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顯示地以參考方式加以引用。其餘變數以傳值方式加以引用。
#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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/supersonico/article/details/47061901