第六章 算法algorithms
(这章这里先粗略读过,大体看懂源码就过,不会深究每个算法的实现细节,
回头再去研究数据结构与算法设计这本)
以有限的步骤,解决逻辑或数学上的问题,我们称为算法。
特定的算法往往搭配特定的数据结构。特定的数据结构是为了实现某种特定的算法。
决定算法所耗用的资源,包括空间和时间,这个操作称为算法分析。
STL算法总览
质变算法,是指运算过程中会更改区间内元素的内容的算法。
比如,拷贝,互换,替换,填写,删除,排列组合,分割,随机重排,排序等。
非
质变算法,是指运算过程中不会更改区间内元素的内容的算法。
比如,查找,匹配,计数,寻访,比较,寻找极值等。
所有泛型算法的前两个操作数都是一对迭代器(first和last,前闭后开)。
这个[first,last)区间的必要条件是,必须能经由累加操作,从first到达last。
许多STL算法不只支持一个版本,通常会有一个缺省版本,
另外的版本提供额外参数,接收外界传入的仿函数,以便采用其他策略。
我把它们称为缺省版和附带仿函数参数版。
有些算法干脆采用两个名称,用_if后缀来表示(采用传入的仿函数进行操作的版本)。
质变算法通常提供两个版本:
1.in-place版,就地改变其操作对象。
2.copy版,将操作对象的内容复制一份副本,然后在副本上进行修改并返回该副本。
copy版总以_copy作为后缀。并不是所有的质变算法都有copy版本。
数值算法实现于,使用时包含。
算法的泛化过程
把操作对象的型别加以抽象化,把操作对象的标示法和区间目标的移动行为抽象化,整个算法也就在一个抽象层面上工作了,整个过程称为算法的泛型化,简称泛化。
用end作为区间内最后一个元素的下一个(表示查找无结果),而不用NULL,是为了与其他容器一起组合带来泛型效果。
数值的传递用pass-by-value是为了减少传递成本。
数值算法
实现于
accumulate、
adjacent_difference、
inner_product、
partial_sum、
power、
itoa(SGI专属)
基本算法
实现于
equal、
fill、
fill_n、
iter_swap、
lexicographical_compare、
max、
min、
mismatch、
swap
copy、
copy_backward
set相关算法
实现于
set_union、set_intersection
、
set_difference
、
set_symmetric_difference
heap算法
实现于,该头文件被包含在
make_heap、push_heap、pop_heap、sort_heap
其他算法
实现于
1.单纯的数据处理
adjacent_find、count、count_if、find、find_if、find_end、find_first_of、for_each、
generate、
generate_n、includes(应用于有序区间)、max_element、merge
(应用于有序区间)
、min_element、partition、remove、
remove_copy、remove_if、remove_copy_if、replace、replace_copy、replace_if、replace_copy_if、
reverse、reverse_copy、rotate、rotate_copy、search、search_n、swap_ranges、transform、
unique、unique_copy。
2.lower_bound
(应用于有序区间)
二分查找的一种版本,返回一个迭代器,指向第一个不小于value的元素。如果找到的话,指向找到的这个位置。
3.upper_bound
(应用于有序区间)
二分查找的一种版本,返回一个迭代器,指向“在不破坏顺序的情况下,可插入value的最后一个合适位置”。
如果找到的话,指向找到的这个位置的下一个位置。
4.binary_search
(应用于有序区间)
是一种二分查找法。调用lower_bound。
5.next_permutation 下一排列
6.prev_premution 上一排列
7.random_shuffle 随机重排
8.partial_sort/
partial_sort_copy
9.sort
Quick sort
Inertion sort
Heap sort
10.equal_range
(应用于有序区间)
二分查找的一种版本
11.inplace_merge
(应用于有序区间)
12.nth_element
13.merge sort