C++ language
C++11 - the new ISO C++ standard
上面三个是C++学习网站,有助于了解C++11的新特性。
lambda表示式(C++11)
1、介绍lambda
我们使用过的仅有两种可调用对象是函数和函数指针。还有其他两种可调用对象:重载了函数调用运算符的类,以及lambda表达式。
一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。
一个lambda表达式的形式为:
[capture list] (parameter list) -> return type {function body}
其中,capture list (捕获列表)是一个lambda所在函数中定义的局部变量的列表(通常为空);
return type,parameter list , function body与任何普通函数一样,分别表示返回类型,参数列表,函数体。
但是,lambda必须使用尾置返回来指定返回类型。
尾置返回类型(C++ 11):
任何函数的定义都能使用尾置返回,但是这种形式对于返回类型比较复杂的函数最为有效,比如返回类型是数组的指针或者数组的引用。
尾置返回类型跟在形参列表后面并以一个->符号开头。为了表示函数真正的返回类型跟在形参列表之后,我们在本应该出现返回类型的地方放置了一个auto。
auto func(int i) -> int (*) [10];//func接受一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组。
我们可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体:
auto f = [ ] {return 42}; 定义了一个可调用对象f,它不接受参数,返回42;//
此时的lambda没有参数列表,没有返回类型 ,只包括 [ ] {return 42;}
cout << f() << endl;//这是lambda的调用方式,和普通函数的调用方式一样,输出42;
2、向lambda传递参数
调用一个lambda时给定的实参被用来初始化lambda的形参,与一个普通函数的调用是一样的。lambda不能有默认参数。
//作为一个带参数的lamdba的例子,我们可以编写一个与isShorter功能一样的lamdba
[] (const string &a, const string &b)
{ return a.size() < b.size();}
/*
空捕获列表表明此lamdba不使用它所在函数中的任何局部变量。
lamdba中的参数与isShorter类似,是const string 引用。
*/
//使用stable_sort
stable_sort(words.begin(), words.end(),
[] (const string &a, const string &b)
{ return a.size() <