概述
- 算法依赖于迭代器,而迭代器不依赖于容器,所以算法不依赖于容器
- 但是算法往往涉及比较,但是容器中的元素不一定定义了比较运算符,所以
大多数的算法提供了一种方法,允许我们使用自定义的操作来代替默认的运算符
初识泛型算法
1. 只读算法
- accumulate(iterator beg, iterator end, T value)
- equal (iterator beg, iterator end, iterator beg2)
对于只读取而不改变元素的算法,最好使用cbegin() cend()
2. 写容器的算法
- fill(iterator beg, iterator end, T value)
- copy(iterator beg, iterator end, Container container)
- replace(iterator beg, iterator end, T oldCValue, T newValue)
- replace_copy(iterator beg, iterator end, iterator position, T value)
3. 重排算法
- sort(iterator beg, iterator end)
- unique(iterator beg, iterator end)
注意: unique 必须在使用sort之后再使用,因为unique的算法是检测相邻的元素是否相等。
定制操作
向算法传递函数
这里要注意的是谓词 的种类,一元谓词只能接收一个参数,二元谓词只能接收两个参数。一元谓词还是二元谓词是由算法本身决定的。
lambda表达式
解决谓词参数数量限制的一种方法
形式
[捕获列表](参数列表) -> return type {函数体}
这部分虽然不常用但是全部都是重点
参数绑定
auto newCallable = bind(callable, arg_list)
这里placeholder的概念很重要,_1, _2… 作为占位符,接收参数,同时还可以巧用于重排参数顺序。
再探迭代器
反向迭代器是重点