STL算法由于有函数对象,而函数对象可以定义任何语义,所以这会带来对STL算法的特殊使用,例如 T accumulate (InputIterator beg. InputIterator end, T initValue, BinaryFunc op)其定义了 initValue op a1 op a2 op a3 op , 当op定义为+时,为求和,当op定义为-时,定义就不同了。
在描述算法时,应注意如下因素:
1。 算法的signature,返回值不是很有意义,可通过保存在函数对象中实现。当然这会影响函数的使用。
2。 是否须遍历整个输入数据,可否中间退出。这个因素影响性能。
3。 函数对象如何和操作数相结合
- for_each
- 输入为1个range _InputIter __first, _InputIter __last, 返回函数对象
- 许遍历所有的元素,不可中间退出
- 对每个对象调用函数对象
- count_if
- 输入为1个range _InputIter __first, _InputIter __last,返回满足某个条件的元素的个数
- 不可中间退出
- 对每个对象调用函数对象
- 通过设计函数对象,可以代替for_each
- min_element/max_element
- 输入为1个range _InputIter __first, _InputIter __last
- 不可中间退出
- if (__comp(*__first, *__result)) __result = __first;
- 通过设计函数对象,可以代替for_each
- find_if
- 输入为1个range _InputIter __first, _InputIter __last,返回满足某个条件的元素
- 可中间退出,由函数对象控制
- search/find_end
- 输入为2个range,返回第一个range的指针
- 不可中间退出
- 第2个range经过某个变换形成的range为第1个range的子集。或第1个range某个变换形成的range包含了第2个range
- 很难定义函数对象更改语义
- find_first_of
- 一个range和多个候选的list
- 可中间退出
- range和候选的元素可以进行变换。很难定义函数对象更改语义
- 可使用for_each代替,但性能降低
- adjacent_find
- 查找两个元素,其互为邻居,但是通过变换满足某个条件。
- 很难定义函数对象更改语义
- equal
- 2个元素个数相等的range
- 可中间退出
- 通过某个变换2个range 相等
- 很难定义函数对象更改语义
- mismatch
- 2个元素个数相等的range
- 不可中间退出
- 可代替equal
- lexicographical_compare
- 2个元素个数可不相等的range
- 可中间退出
- 很难定义函数对象更改语义
- 可代替equal
- 对2个range中位置相同的元素调用函数对象
- transform
- 对1/2个range进行变换生成另一个range
- 不可中间退出
- 两种transform可通过定义函数对象相互代替
- generate_n/generate
- 由函数对象生成一个range
- 可和transform相互代替
- replace_if / replace_copy_if / remove_if / unique / unique_copy
- 很难定义函数对象更改语义
- random_shuffle / partition / stable_partition
- 很难定义函数对象更改语义
- sort / stable_sort / partial_sort / partial_sort_copy / nth_element / make_heap / push_heap / pop_heap/ sort_help
- 很难定义函数对象更改语义
- accumulate
- 1 个range。 1个初始值。1个函数对象。
- initValue op a1 op a2 op a3 op
- inner_product
- 2 range, 1 initial value. 2 函数对象
- ((initValue op1 (a1 op2 b1)) op1 (a2 op2 b2) )op1 (a3 op2 b3)
- partial_sum
- 生成新range, 其内容为 a1, a1 op a2, (a1 op a2 ) op a3
- adjacent_difference
- 生成新range, 其内容为a1, a2 op a1, a3 op a2, a4 op a3, .
- 若可以中间退出可以代替adjacent_find..