先记一下,以后补充,免得忘记
函数:
函数指针:
重载了函数调用运算符的类:
lambda表达式:表示一个可调用代码单元,可以理解为一个未命名的内联函数。
与任何函数类似,一个lambda有一个返回类型,一个参数列表和一个函数体。但不同的是,lambda可能定义在函数内部。
形式:[capture list](parameter list) -> return type { function body }
其中capture list(捕获列表)是一个lambda所在函数定义的局部变量的列表(通常为空);lambda必须使用尾置返回来指定返回类型。 我们可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体
如:auto f = [ ] { return 42; }
cout<< f() <
void biggies(vector<string> &words, vector<string>::size_type sz)
{
auto wc = find_if(words.begin(),words.end(),[sz] ( const string &a)
{ return a.size() >= sz; });//输出长度大于sz的单词
for_each( wc, words.end(), [] ( const string &s ) { cout << s << " "; } );//打印长度大于sz的单词,并每个单词后面都加上' '
}
lambda的捕获和返回:
值捕获:前提是变量可以拷贝,被捕获的变量的值是在lambda创建时拷贝,因此随后对其修改不会影响lambda内对应的值。
void fcn1()
{
size_t v1 = 42;
auto f = [v1] () { return v1; }
v1 = 0;
auto j = f();//j为42
}
引用捕获:必须确保被引用的对象在lamb时是存在的。
`void fcn1()
{
size_t v1 = 42;
auto f = [&v1] () { return ++v1; }
v1 = 0;
auto j = f();//j为0
}
`
隐式捕获:[=],[&],等等,让编译器根据lambda中的代码来推断我们要使用哪些变量。
可变lambda:默认情况下,对于一个值被拷贝的变量,lambda不会改变其值。如果我们希望能改变一个被捕获的变量的值,就必须在参数列表后加上关键字mutable:
void fcn2()
{
size_t v1 = 42;
auto f = [v1] () mutable { return ++v1; }
v1 = 0;
auto j = f();//j为43
}