泛型算法
- 算法永远不会改变底层容器的大小,因为算法不会执行容器操作,它们运行在迭代器之上
- 算法可能改变容器中保存的元素的值,也可能在容器内移动元素,但永远不会直接删除或添加元素
- 对于只读取而不改变元素的算法,通常最好使用cbegin() & cend()。find,count,equal是只读算法
- 算法不检查写操作
- 向目的位置迭代器写入数据的算法假定目的位置足够大,能够容纳要写入的数据
lambda - lambda只能使用尾置返回来指定返回类型
- 如果lambda的函数体包含任何单一return语句之外的内容,且未指定返回类型,则返回void
- lambda不能有默认参数、、
- lambda可以定义在函数中
- lambda只有在其捕获列表中捕获一个它所在函数中的局部变量才能在函数体中使用这个变量
- 捕获列表只用于局部非static变量,lambda函数体可以直接使用局部static变量和在它所在函数之外声明的名字
- lambda的变量捕获方式可以采用值或者引用
- IO对象无拷贝或赋值。P279
- 当以引用方式捕获一个变量时,必须保证在lambda执行时变量是存在的
- lambda捕获列表P352
可变lambda - 默认情况下,一个值被拷贝的变量,lambda一般不会改变其值。使用mutable关键字,在lambda的参数列表后,可以改变捕获的局部变量的值。
- 引用捕获的变量是否可修改,依赖于此引用指向的是否是const类型
参数绑定 - 如果lambda的参数列表为空,通常可以用函数代替。
- 对于捕获局部变量的lambda,使用标准库bind函数
- auto newCallable = bind(callable, arg_list);
- 可以使用bind重排参数顺序
- 如果我们希望传递给bind函数一个对象而又不拷贝它,就必须使用标准库ref函数。p357
- P361-P364 to be learnt
泛型算法结构 - 通用的sort要求随机访问迭代器,因此不能用于list & forward_list
- 对于list和forward_list应该优先使用成员函数而不是通用算法。P369