STL源码剖析(十七)算法

本文深入探讨了标准模板库(STL)中的算法,包括它们的用途、复杂度分析及常见操作如排序、查找、复制和变换。算法如accumulate、binary_search、sort和transform等,通过迭代器在不同数据结构上实现泛型编程。STL算法分为质变和非质变两类,前者改变元素内容,后者保持不变。此外,介绍了迭代器的概念,它是STL算法能够应用于多种数据结构的关键。
摘要由CSDN通过智能技术生成

算法概观
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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值