STL之算法总结

来源:互联网 发布:js split 数组 遍历 编辑:程序博客网 时间:2024/05/22 17:00

一.数值算法(若使用数值算法必须包含头文件<numeric>)

   1>accumulate( first,  end ,  init):求解的是init和 [first, end)数值的总和.init一定要初始化,这样可以保证first和end为NULL时得到一个确切的值。

   2>adjacent_difference(first  ,last  ,  result):用来计算[first , last)中相邻元素的差额。

   3>inner_product(first1, last1,  first2, init ):用来计算[first1 ,last1)和[frist2, (last1-first1))的一般内积。记得一定要对init进行初始化。

   4>partial_sum(first , last , result):用来计算局部总和。

   5>power( x, n)或power(x , n, op)该算法由SGI专属,并不在STL标准之中。用来计算x的n次幂,也可以由外界指定运算符类型。

   6>iota(first , last , value):用来设定某个区间的内容, 使其内的每一个元素从指定的value值开始,呈现递增状态。

二.基本算法<stl_algobase.h>

  1>equal(first1 , last1 ,first2):判断两个序列在[first,last)区间内是否相等,相等返回true,如果第二个元素多,多出来的元素不给予考虑。

  2>fill(first, last , x);在[first , last)区间中全部填X,  fill_n(first , n , x):在first指定位置开始填入n个x。要是插入个数大于容器的大小,则会造成不可预料的结果,解决办法是用一个可以进行插入的容器。

  3>iter_swap(a,b):将所指对象进行对调。

  4>lexicographical_compare(first1 , last1 ,first2 , last2)比较两个序列中对应位置的大小,若全部相等返回false,第一个序列小或比第二个序列短则返回true,否则返回false。

  5>max( a , b)取两个对象中较大值。

  6>min( a , b)取两个对象中较小值。

  7>mismatch(first1 , last1 , first2)返回一个pair,第一个数是序列1中不行等的位置,second是序列2中不相等的位置。

  8>swap(a, b)用来交换两个对象之间的内容。

  9>copy(first, last  ,result):将[first , last)内的元素复制到[result , result+ (last - first))区间内。其对参数非常宽松,可以将任何类型的容器的内容复制到任何类型容器中去。

  10>copy_backward(first ,last, result)与copy非常相似,只不过是将[first ,last )区间的内容复制到[result,result-(last-first))区间中去,且参数必须为bidirctionallterators。

  11>set相关算法:并集,交集,差集,对称差集。这四个算法所接受的set,必须是有序区间,元素值得重复出现。所以只能接受set/multiset容器作为输入区间。

       1.set_union(first1,last1,first2,last2,result)并集。由于s1和s2中的每个元素出现次数不唯一,s1中出现n次,s2中出现m次,则在输出区间该值出现max(m,n),其中n个来自于s1,其余来自s2。

       2.set_insertsection(first1,last1,first2,last2,result)交集。一个元素不唯一,s1中n次,s2中m次,结果中min(m,n)次,并且全部来自s1,。次方法是一种稳定操作。

       3.set_difference(first1,last1,first2,last2,result)差集。元素不唯一,s1中n次,s2中m次,输出区间中会是max(n-m,0),全部来自s1.

       4.set_symmetric_difference(first1,last1,first2,last2,result)对称差集,也就是(s1-s2)并(s2-s1)。元素不唯一,出现次数是|n-m|。哪个大是从哪个复制得来。

   12>heap算法:make_heap(),pop_heap(),push_heap(),sort_heap()。

 三:其他算法

1>单纯的数据处理:

1.adjacent_find(first,last)找出第一组满足条件的相邻元素。这里所谓的条件在版本一中是指“两元素相等”,在版本二中允许用户指定一个二元运算,两个操作数分别是相邻的第一个元素和第二个元素。

2.count(first,last,value)运用equality操作符,将区间内的每一个元素拿来和指定值value比较,并返回与value相等元素的个数。

3.count_if(first,last,pred)将指定操作(一个仿函数)pred实施于区间内的每一元素身上,并将“造成pred之计算结果为true”的所欲元素的个数返回。

4.find(first,last,value)根据equality操作符,循序查找区间内的所有元素,找出第一个匹配“相等条件”者。如果找到返回一个inputiterator指向该元素,否则返回last。

5.find_if(first,last,pred)与上述差别只是返回第一个另pred为true者。

6.find_end(first1,last1,first2,last2)找出区间2在区间1中出现的最后位置,不含有则返回last1.

7.find_first_of(first1,last1,first2,last2)区间二在区间一中第一次出现的位置。

8.for_each(first,last,f)将方法f施加在区间内的每一个元素身上。

9.generate(first,last,gen)将gen运算的结果填写在区间的每一个元素身上。

10.generate_n(first,n,gen)将gen的运算结果填写在迭代器first开始的n个元素身上。

11.includes(first1,last1,first2,last2)(应用于有序区间)判断区间2是否涵盖于区间一中。

12.max_element(first,last)该算法返回一个迭代器,指向序列之中数值最大的元素。

13.merge(first1,last1,first2,last2,result)将两个经过排序的集合s1和s2合并起来置于另一个空间。所得结果也是一个有序序列。返回一个迭代器,指向最后结果序列的最后一个元素的下一个位置。

14.min_element(first,last)返回一个迭代器,指向序列之中数值最小的元素。

15.partition(first,last,pred)将区间中的元素重新排列,所有被一元条件运算pred判断为true的元素都会被放在区间的前段,false的放在区间的后段。这个算法并不保留元素的原始相对位置,如果想要保留原始相对位置,应使用stable_partition。

16.remove(first,last,value)(但不删除)移除区间内与value相等的值。这一算法并不真正从容器中删除那些元素(换句话说容器大小并未改变),而是将每一个不与value相等ForwardIterator表示出重新整理后的最后元素的下一个位置。

17.remove_copy(frist,last,result,value)与上述功能相同,只是将结果复制到一个以result表示起始位置的容器身上。

18.remove_if(first,last,pred)同remove()相同。

19.remove_copy_if

(first,last,result,pred)和remove_copy()相同。

20.replace(first,last,old_value,new_value)区间内的旧值被新值代替。

21.replace_copy(first,last,result,old_value,new_value),新序列会被复制到result中。

22.replace_if(first,last,pred,new_value)被pred评估为true的会被替换为new_value。

23.replace_copy_if(first,last,result,pred,new_value)与上述一样。

24.reverse(first,last)元素在容器中颠倒重排。

25.reverse_copy(first,last,result)新序列会被复制到result中。

26.rotate(first,middle,last)将[first,middle)和[middle,last)内的元素互换。

27.rotate_copy(first,middle,last,result)结果会被置于result所指的容器中。

28.search(first1,last1,first2,last2)在序列一中查找序列二首次出现点。

29.search_n(first,last,count,value)在序列中查找value出现n次的起始点。//当然还有仿函数的版本

30.swap_range(first1,last1,first2)将区间一中的元素与“从first2开始,个数相同”的元素相互交换。

31.transform(first,last,result,op)和transform(first1,last1,first2,result,op):第一个版本以仿函数op作用于区间中的每一个元素身上,并以其结果产生一个新序列。第二个版本以仿函数binary_op作用于一双元素身上(其中一个来自于区间一,一个来自于区间二),并以其结果产生一个新序列。如果第二个序列的元素少于第一个元素的序列结果未可预期。

32.unique(first,last)能过移除相邻的重复元素。并不改变原区间的大小。算法稳定。借助unique_copy完成。

33.unique_copy(first,last,result)与unique相同,只不过是返回一个新区间。

2>工作原理较复杂的算法:

1.lower_bound(first,last,value):这是二分查找的一个版本,在 有序区间内查找与value值相等的元素s,指向其中的第一个元素,总之为该元素应该插入的位置。

2.upper_bound(first,last,value):是二分查找的一个版本。返回在不破坏顺序的情况下的可插入value的最后一个合适的位置。若value存在会返回value的下一个位置。

3.binary_search(first,last,value):二分查找,若有value返回true。

4.next_permutation(first,last):会取得区间所标示之序列的下一个排列组合,没有返回false,有返回true。

5.prev_permutation(first,last):取序列的上一个排列组合,没有返回false,有返回true。

6.random_shuffle(first,last):将区间内的次序随机重排,在N!中随便取一种。

7.partial_sort(first,middle,last)/partial_sort_copy(first,last,result_first,result_last):保证[first,middle)中的为最小的元素且有序,后区间不保证有序。

8.sort(first,last):数据量大时采用Quick Sort,分段递归排序,一旦分段后的数据量小于某个门槛,为了避免Quick Sort的递归调用带来的过得额外的负荷,就改用Insertion Sort。如果递归层次过深,还会改用Heap Sort

9.equal_range(first,last,value)(应用于有序区间):是二分查找的一个版本,返回一对迭代器i和j,i是不破坏次序的前提下value可插入的第一个位置,j是最后一个位置。因此[i,j)内的每一个元素都等于value,而且是次区间内符合此性质的最大区间。

10.inplace_merge(first,middle,last)如果前半段区间和后半段区间都有序,则该算法会将他们结合成单一的序列并保证有序。递增则结果递增,递减则结果递减。

11.nth_element(first,nth,last):会重新排序,前半段小于后半段,两段不保证有序。

12.mergesort(first,last):与快排时间复杂度相同。因为会有额外的内存而且内存之间移动数据也会耗费不少时间所以效率比不上快排。

0 0
原创粉丝点击