STL算法

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。 函数对象如何和操作数相结合

  1.  for_each
    1. 输入为1个range _InputIter __first, _InputIter __last, 返回函数对象
    2. 许遍历所有的元素,不可中间退出
    3. 对每个对象调用函数对象
  2.  count_if
    1. 输入为1个range _InputIter __first, _InputIter __last,返回满足某个条件的元素的个数
    2. 不可中间退出
    3. 对每个对象调用函数对象
    4. 通过设计函数对象,可以代替for_each
  3.  min_element/max_element
    1. 输入为1个range _InputIter __first, _InputIter __last
    2. 不可中间退出
    3. if (__comp(*__first, *__result))  __result = __first;
    4. 通过设计函数对象,可以代替for_each
  4. find_if
    1. 输入为1个range _InputIter __first, _InputIter __last,返回满足某个条件的元素
    2. 可中间退出,由函数对象控制
  5. search/find_end
    1. 输入为2个range,返回第一个range的指针
    2. 不可中间退出
    3. 第2个range经过某个变换形成的range为第1个range的子集。或第1个range某个变换形成的range包含了第2个range
    4. 很难定义函数对象更改语义
  6. find_first_of 
    1. 一个range和多个候选的list
    2. 可中间退出
    3. range和候选的元素可以进行变换。很难定义函数对象更改语义
    4. 可使用for_each代替,但性能降低
  7. adjacent_find
    1. 查找两个元素,其互为邻居,但是通过变换满足某个条件。
    2. 很难定义函数对象更改语义
  8. equal
    1. 2个元素个数相等的range
    2. 可中间退出
    3. 通过某个变换2个range 相等
    4. 很难定义函数对象更改语义
  9.  mismatch   
    1. 2个元素个数相等的range
    2. 不可中间退出
    3. 可代替equal
  10. lexicographical_compare 
    1. 2个元素个数可不相等的range
    2. 可中间退出
    3. 很难定义函数对象更改语义
    4. 可代替equal
    5. 对2个range中位置相同的元素调用函数对象
  11. transform
    1. 对1/2个range进行变换生成另一个range
    2. 不可中间退出
    3. 两种transform可通过定义函数对象相互代替
  12. generate_n/generate
    1. 由函数对象生成一个range
    2. 可和transform相互代替
  13. replace_if / replace_copy_if / remove_if / unique / unique_copy
    1. 很难定义函数对象更改语义
  14. random_shuffle / partition / stable_partition 
    1. 很难定义函数对象更改语义
  15. sort / stable_sort / partial_sort / partial_sort_copy / nth_element / make_heap / push_heap / pop_heap/ sort_help 
    1. 很难定义函数对象更改语义
  16. accumulate 
    1. 1 个range。 1个初始值。1个函数对象。
    2. initValue op a1 op a2 op a3 op 
  17. inner_product 
    1. 2 range, 1 initial value. 2 函数对象
    2. ((initValue op1 (a1 op2 b1)) op1 (a2 op2 b2) )op1 (a3 op2 b3)
  18. partial_sum 
    1. 生成新range, 其内容为 a1, a1 op a2, (a1 op a2 ) op a3
  19. adjacent_difference
    1. 生成新range, 其内容为a1, a2 op a1, a3 op a2, a4 op a3, .
    2. 若可以中间退出可以代替adjacent_find..


你可能感兴趣的:(CPlusPlus,算法,random,each,list)