本文中算法都是指泛型算法。程序员
基本要点:算法
1)算法使用迭代器进行操做。数组
2)不依赖容器,但容器但愿使用算法,就必须提供接口。函数
3)通用算法永远不会执行容器操做。操做仅指:更改容器大小的操做。但,容器内部的算法不包括在通用中。spa
4)算法使用一个 可调用对象 来对元素进行操做。可 调用对象 一般为函数。
指针
1,算法一般使用默认操做符 [<],[==],[>] 等。对象
2,本质上就是调用一个对象做为算法的比较。接口
3,一般的方式有:谓词,操做符重载,lambda表达式。编译器
5)算法不检查写操做:即算法写入元素值时,程序员必须保证容器已经有足够空间去保存。此错误编译器不报错。io
6)特定容器算法,能够改变容器尺寸。
谓词:
1)包括一元谓词和二元谓词。元概念:接收参数的数量。
2)能够用来代替算法中原有的比较规则。例如:find() 使用谓词代替默认需求操做符[ == ]。
3)谓词能够是:表达式,函数。
4)谓词有严格的参数数量限制。当超出时,使用lambda表达式。
lambda表达式: [capture list] (parameter list) -> return type { function body }
1)capture list:捕获列表。
1,能够得到 lambda表达式 所在函数的局部变量。
2,默认为copy值。若是,使用引用捕获,必须保证lambda执行时,变量时存在的。
3,使用mutable关键字,能够传值使用时,依然改变原变量值。
2)返回类型必须使用 尾置返回
1,尾置返回的一个例子:auto func(int i) -> int(*)[10] { function body } // 返回为一个int数组。大小为10
3)function body中包含除return外的语句时:
1,默认返回void,若是须要返回值,请使用 尾置返回。
2,若是只有一句 return 语句时。会根据return值,返回对应类型。
5)表示式能够赋值给变量。
1,不肯定:做为变量,仍是做为函数指针。我的倾向于指针。
2,简单使用方式:auto f2 = [&v1] { return ++v1; }