C++ Primer Chapter 10-2

来源:互联网 发布:监控摄像头模拟转网络 编辑:程序博客网 时间:2024/06/08 11:34
1:lambda 可以直接使用函数之外的变量,其捕获列表只捕获 lambda 所在函数内部的局部变量

2:利永 lambda 捕获机制 使得谓词可以传递更多的变量和信息

3:一般的 lambda 都是内联的。带捕获的 lambda 一般 其捕获参数要先 定义好。 

4:partition 是一个利用谓词对范围内元素进行分离,两类(一类为使得谓词返回值为ture的元素,一类是false)。

5:可以认为 lambda 是一个类型,其捕获参数是成员数据,捕获参数在 lambda创建时被创建( 被捕获的变量在lambda 被创建时就被拷贝备份),但是引用捕获就不一样
  1. auto f = [&v1] () {return }

6:函数可以返回一个 lambda ,但是该 lambda 不能引用的捕获,因为引用捕获会使得 lambda 的返回值也是引用,则就导致函数返回了一个零时引用,不可行。

7:尽量避免捕获指针和引用,因为 lambda 引用必须保证在lambda执行时变量值是有效的

8:隐式的捕获,只用 = 或者 & 来指示是赋值,还是引用,还可以混合。具体见page 352

9:如果 要求 lambda 改变捕获的参数值,可以用mutable修饰如下
  1. auto f = [value] () mutable -> int {function body}// 再返回类型和参数列表直间修饰

10:为什么用 lambda 而不用函数:这还是由于谓词的特性决定的,谓词的参数只能是 泛型算法中范围里元素的类型,或者是该类元素可以转换成的类型,而不可以传递其他类型的参数,这样就只能用捕获列表捕获其他不适配类型参数和信息了。另外有时候谓词最多只能有两个参数多余参数只能用捕获列表来获取。

11:函数的参数绑定:利用标准库中的 bind 函数来绑定一个函数,生成一个可调用对象,该对象用的参数可以比原函数少
  1. fun(int a, int b);
  2. auto fun1 = bind(fun ,_1, 6)// 这里先定义 fun 函数,然后用 _1 占位符来表示fun1 可调用对象参数fun 中第一个参数 即 a ,而第二个参数被默认为 6;

实际上:在调用 fun1 时,把其参数给 fun 的第一个参数,然后 fun 第二个参数用 6 替代。其实可以理解为绑定调用,只不过某些值可以设置成默认的值,或者变量,但是最初调用处传递的参数会变少    有点类似委托构造函数的理解方式。

0 0
原创粉丝点击