算法概观
1,以有限的步骤,解决逻辑或数学上的问题,称为算法。
2,以下所探讨的是记录于STL中,极具复用价值的STL算法。
算法分析和复杂度表示O()
1,一般而言,算法的执行时间和所要处理的数据量有关,两者之间存在某种函数关系,一次、二次、三次或对数关系,分别表示为O(N), O(N2), O(N3) , O(logN),数据量小时,多项式函数每项内容都可能对结果产生影响,数据大时,只有最高次方的项目才具主导地位。
STL算法总览
算法名称 算法用途
accumulate 元素累计
adjacent_difference 相邻元素的差额
adjacent_find 查找相邻而重复或符合某条件的元素
binary_search 二分查找
Copy 复制
Copy_backward 逆向复制
Copy_n* 复制n个元素
Count 计数
count_if 在特定条件下计数
equal 判断两个区间相等与否
equal_range 试图在有序区间中寻找某值(返回一个上下限区间)
fill 改填元素值
fill_n 改填元素值,n次
find 循序查找
find_if 循序查找符合特定条件者
find_end 查找某个子序列的最后一次出现点
find_first_of 查找某些元素的首次出现点
for_each 对区间内的每个元素施行某操作
generate 以特定操作之运算结果填充特定区间内的元素
generate_n 以特定操作之运算结果填充n个元素内容
includes 是否涵盖某序列之中
inner_product 内积
inplace_merge 合并并就地替换,覆写上去
Iota* 在某区间填入某指定值的递增序列
is_heap* 判断某区间是否为一个heap
is_sorted* 判断某区间是否已排序
iter_swap 元素互换
lexicographical_compare 以字典顺序进行比较
lower_bound 将指定元素插入区间之内而不影响区间原本排序的最低位置
max 最大值
max_element 最大值所在位置
merge 合并两个序列
min 最小值
min_element 最小值所在位置
mismatch 找出不匹配点
next_permutation 获得下一个排列组合
nth_element 重新安排序列中第n个元素左右两端
partial_sort 局部排序
partial_sort_copy 局部排序并复制到他处
partial_sum 局部求和
partition 分割
prev_permutation 获得前一个排列组合
power* 幂次方,表达式可指定
random_shuffle 随机可重排元素
random_sample* 随机取样
random_sample_n* 随机取样
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 查找连续发生n次的子序列
set_difference 差集
set_intersection 交集
set_symmetric_difference 对称差集
set_union 并集
sort 排序
stable_partition 分割并保持元素的相对次序
stable_sort 排序并保持等值元素的相对次序
swap 交换
swap_ranges 交换指定区间
transform 以两个序列为基础,交互作用产生第三个序列
unique 将重复的元素折叠缩编,使成唯一
unique_copy 将重复的元素折叠缩编,使成唯一,并复制到他处
upper_bound 将指定元素插入区间之内且不影响区间内原本排序的最高位置
make_heap 制造一个heap
pop_heap 从heap取出一个元素
push_heap 将一个元素推进heap内
sort_heap 对heap排序
1,所有的STL算法都作用在由迭代器[first, last)标示的区间上,质变算法指运算过程中会更改区间内迭代器所指元素内容,例copy, swap, replace, fill, remove, permutation, partition, random shuffling, sort等算法。
2,非质变算法,指运算过程中不会更改区间内迭代器所指元素内容,例find, search, count, for_each, equal, mismatch, max, min等。
STL算法的一般形式
1,所有泛型算法前两个参数一般是一对迭代器[first, last),根据行进特性,迭代器可分为5类,STL算法声明出最低程度的迭代器类型。传递无效的迭代器不能保证在编绎时期被捕捉出来。
2,质变算法通常提供两个版本,一个是in-place就地进行版,就地改变其操作对象,一个是copy另地进行版本,将操作对象的内容复制副本,然后在副本上进行修改并返回副本。
3,所有的数值算法,包括adjacent_difference(), accumulate(), inner_product(), partial_sum等实现于<stl_numeric.h>中,其他算法都实现于<stl_algo.h>和<stl_algobase.h>文件中,这些都是内部文件,欲使用这些算法,必须先包含上层文件< numeric>和< algorithm>。
算法的泛化过程
1,设计算法独立于其所处理的数据结构之外,适用于大多数数据结构,即在未知的数据结构上正确地实现操作,关键在于把操作对象的类型抽象化,操作对象的区间和目标移动抽象化,算法工作于抽象层面上,这个过程称算法的泛型化,简称泛化。
2,例find()算法适用于允许指针的容器,指针可支持find()中出现的操作,判断不相等操作符、取值操作符、前置式递增操作符、复制行为。以上操作符和操作行为都可以被重载,支持以上四种行为且很像指针的对象同样也可适用于find(),如此find()不必限制只能使用指针,可从原生指针的思想中跳出来,这便是迭代器的概念。如果以一个原生指针指向某个list,对该指针++并不能指向下一个串行节点,设计一个class,拥有原生指针的行为,并使++操作作指向list的下一个节点,find()便可以使用在list容器上。
3,迭代器是一种行为类似指针的对象,是一种smart pointers。