10泛型算法
10.1概述
泛型算法不能改变容器的大小,依赖于元素类型的操作。
![](https://img.haomeiwen.com/i8542527/3d46df1e425af465.png)
![](https://img.haomeiwen.com/i8542527/216d8be586b434e0.png)
10.2初识泛型算法
10.2.1只读算法
find
![](https://img.haomeiwen.com/i8542527/667b28201648d3cb.png)
![](https://img.haomeiwen.com/i8542527/33c08e185d37015a.png)
10.2.2写容器元素的算法
fill
![](https://img.haomeiwen.com/i8542527/c61678aa3532cbe6.png)
back_inserter
![](https://img.haomeiwen.com/i8542527/feecca367861bc22.png)
![](https://img.haomeiwen.com/i8542527/92e48b3aaaba40e6.png)
10.2.3重排容器元素的算法
sort, unique
![](https://img.haomeiwen.com/i8542527/ffef062637c3e23b.png)
10.3定制操作
10.3.1想算法传递函数
谓词:是一个可调用的表达式,其返回结果是一个能用作条件的值(即返回作为条件去判断)。
一元谓词接受单一参数,二元谓词两个。接受谓词参数的算法元素类型必须能转换成谓词的参数类型。
10.3.2lambda
可调用类型有:函数,函数指针,lambda表达式,重载了函数调用运算符的类。
![](https://img.haomeiwen.com/i8542527/c454c5a231b8b39c.png)
![](https://img.haomeiwen.com/i8542527/3fd9669df3e05694.png)
![](https://img.haomeiwen.com/i8542527/9b66ee9049335494.png)
向lambda传递参数
Lambda不能有默认参数,调用的实参数目永远与形参数目相等。
使用捕获列表
![](https://img.haomeiwen.com/i8542527/a6b278ccfa5fff96.png)
10.3.3lambda捕获和返回
值捕获
值捕获的前提是变量可以拷贝,与参数不同,被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝。
引用捕获
必须保证被引用的对象在lambda执行的时候是存在的。
![](https://img.haomeiwen.com/i8542527/7cee439978dcdba7.png)
隐式捕获
编译器可以推断捕获列表,但要在列表中加&或=,&表引用,=表值。
可以混合使用隐式捕获和显式捕获。但第一个元素必须是隐式的。
![](https://img.haomeiwen.com/i8542527/1e585dce7ffd7c64.png)
可变lambda
希望改变一个捕获的值,加关键字mutable
![](https://img.haomeiwen.com/i8542527/94a02b1b406b4177.png)
指定lambda的返回类型
必须尾置返回类型
![](https://img.haomeiwen.com/i8542527/b78f367408528ff4.png)
10.3.4参数绑定bind
头文件functional, 命名空间在std::placeholders
![](https://img.haomeiwen.com/i8542527/15230e32c64ba72f.png)
![](https://img.haomeiwen.com/i8542527/de5b7975b9a71af5.png)
![](https://img.haomeiwen.com/i8542527/8300ab511c99a84f.png)
例:f(a, b, c, d, e);
Auto g=bind(f, a, b, _2, d, _1);
g(X, Y);等价于f(a, b, Y, d, X);
![](https://img.haomeiwen.com/i8542527/c7e44e2d6eb77431.png)
10.4再探迭代器
![](https://img.haomeiwen.com/i8542527/e8ed62dd0ed609a2.png)
![](https://img.haomeiwen.com/i8542527/5b29f760b1813d10.png)
10.4.1插入迭代器
![](https://img.haomeiwen.com/i8542527/b74019fc3a894430.png)
10.4.2iostream迭代器
![](https://img.haomeiwen.com/i8542527/7e529fcd9d9ff6e7.png)
Iostream_iterator操作
![](https://img.haomeiwen.com/i8542527/8fc3010cae38428e.png)
Ostream_iterator操作
![](https://img.haomeiwen.com/i8542527/b6d442f53f1b9230.png)
10.4.3反向迭代器
rbegin,rend, crbegin, crend
除了forward_list外其他容器都支持。
反向迭代器与正常的顺序是相反的,也有++,--但与正常相反
![](https://img.haomeiwen.com/i8542527/7912bbaf3e15c2fe.png)
![](https://img.haomeiwen.com/i8542527/9f2dbc8ec52efa1d.png)
用base()获得正常的迭代器。
10.5泛型算法结构
![](https://img.haomeiwen.com/i8542527/c1a5e31fe0fa4b4a.png)
10.5.1 5类迭代器
![](https://img.haomeiwen.com/i8542527/2c8a1abd057442c6.png)
![](https://img.haomeiwen.com/i8542527/3232c6bf056f9e33.png)
![](https://img.haomeiwen.com/i8542527/947cfb6b00f0d9d0.png)
![](https://img.haomeiwen.com/i8542527/714d186e22ba05c9.png)
10.5.2算法形参模式
![](https://img.haomeiwen.com/i8542527/b072efb209c895fb.png)
Dest表示算法可以写入目的位置的迭代器
10.5.3算法命名规范
![](https://img.haomeiwen.com/i8542527/74df40a022643b27.png)
![](https://img.haomeiwen.com/i8542527/f71dd1bca6cfd4f1.png)
![](https://img.haomeiwen.com/i8542527/3193fa0860456f51.png)
10.6特定容器算法
![](https://img.haomeiwen.com/i8542527/8d3eb715196edd94.png)
![](https://img.haomeiwen.com/i8542527/1524186ca944c11f.png)
![](https://img.haomeiwen.com/i8542527/19ecd8318089afff.png)
网友评论