STL部分算法

以vector和array为底层,实现heap算法的区别?

array为低层实现时,对满载的数组,不能再进行push_heap()操作

      不太方便,安全 

低层以vector实现的例子

  STL部分算法_第1张图片 

低层以array实现的例子

    STL部分算法_第2张图片  

lower_bound/upper_bound

特别注意:

区别:若存在元素,lower_bound 返回指向元素的迭代器,

upper_bound返回的迭代器是指向value的下一位置,非本身

作用:利用二者可查找排序数组中有多少重复的数

STL的另一个二分查找的版本为equal_range

返回一对迭代器i,和j,

i:value可插入的第一个位置,即lower_bound

j:value可插入的最后一个位置,即upper_bound,

equal_range:通过lower_bound,upper_bound实现��f a> ����ng=EN-US>lower_bound,upper_bound,的版本:

《剑指offer》上lower_bound,upper_bound,的版本:

    STL部分算法_第3张图片
  STL部分算法_第4张图片
   STL部分算法_第5张图片  

random_shuffle算法

随即排列[first,last),概率为1/N!

i 个元素和第 [0 i+1) 之间随即产生的一个数交换

partial_sort ,partial_sort_copy

(first,middle,last)

将middle-first个最小元素以递增顺序排列,其余元素不保证顺序;

 应用:只对前N个元素排序时,

算法:

1:[first,middle]之间的元素建立大顶堆;

2:对[middle,last)间的元素遍历,若小于堆顶元素,则与堆顶元素交换,并将

[first,middle]之间的元素重新建立大顶堆,直至遍历结束;

3:对[first,middle]间的元素排序

sort:

sort:需要两个随即迭代器

故:list,slist不能使用,只能使用本身的成员函数

关系型容器,以RB_tree实现,不需要;

stack,queue和priority-queue有特别的入口,不允许对元素排序

其中(1)快排:采用三点中值选取枢轴

(2)阈值的选择:本无定论,因设备而异,STL采用16,《编程珠玑》作者,选取100万个数,对阈值在[1,100]实验,最佳值为50

(3)最后,几近排序,但未完成时,采用插入排序。

(4)快排会恶化为n*n,sort()使用内省式排序,
 STL中的sort()算法:
1:[first,middle]之间的元素建立大顶堆;

2:对[middle,last)间的元素遍历,若小于堆顶元素,则与堆顶元素交换,并将

[first,middle]之间的元素重新建立大顶堆,直至遍历结束;

3:对[first,middle]间的元素排序

for_each/ generate/ transform

对区间每个元素实行操作
for_each(iv.begin(),iv.end(),display<int>());不改变元素内容

generate(iv.begin(),iv.end(),even_by_two());改变元素内容
但第三个参数不能有任何参数
例如:generate(iv.begin(),iv.end(),bind2nd(plus<int>(),3));错误
generate_n(iv.begin(),3,even_by_two());//一段长度

区间的值,全部减2
transform(iv.begin(),iv.end(),bind2nd(minus<int>(),2));
第二区间加到第一区间的对应元素上。第二区间元素个数不少于第一区间
transform(iv.begin(),iv.end(),iv2.begin(),iv2.end(),plus<int>());

要求排序的算法

是否iv2的所有元素都出现在iv1中
要求:二者必须排序好
includes(iv1.begin(),iv2.end(),iv2.begin(),iv2.end());
合并两个序列
要求:必须排序好
merge(vi1.begin(),iv1.end(),iv2.begin(),iv2.end(),iv3.begin());
符合条件放前面,不符合放后面,不保证原有次序
partition(iv.begin(),iv.end(),even())

去除连续而重复的元素,有残余
unique(iv.begin(),iv.end())
unique(iv.begin(),iv.end(),iv2.begin());

比较复杂算法的应用

lower_bound(iv.begin(),iv.end(),21);
upper_bound(iv.begin,iv.end(),22);
binary_search(iv.begin(),iv.end(),34);
next_permutation(iv.begin(),iv.end());
prev_permutation(iv.begin(),iv.end());
random_shuffle(iv.begin(),iv.end());
partial_sort(iv.begin(),iv.begin()+4,iv.end());
sort(iv.begin(),iv.end());//缺省为递增
sort(iv.begin(),iv.end(),greater<int>());
stable_sort(iv.begin(),iv.end());
pair<vector<int>::iterator,vector<int>::iterator>pairite;
pairite=equal_range(iv.begin(),iv.end(),22);
pairite.first
pairite.second

将大于*(iv.begin()+5)的元素放在它左边,小于放右边
nth_element(iv.begin(),iv.begin()+5,iv.end(),greater<int>());

stable_partition(iv.begin(),iv.end(),even());

















你可能感兴趣的:(STL部分算法)