array为低层实现时,对满载的数组,不能再进行push_heap()操作
不太方便,安全
低层以vector实现的例子
特别注意:
区别:若存在元素,lower_bound 返回指向元素的迭代器,
upper_bound返回的迭代器是指向value的下一位置,非本身
作用:利用二者可查找排序数组中有多少重复的数
返回一对迭代器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,的版本:随即排列[first,last),概率为1/N!
第 i 个元素和第 [0 , i+1) 之间随即产生的一个数交换(first,middle,last)
将middle-first个最小元素以递增顺序排列,其余元素不保证顺序;
应用:只对前N个元素排序时,
算法:
1:[first,middle]之间的元素建立大顶堆;
2:对[middle,last)间的元素遍历,若小于堆顶元素,则与堆顶元素交换,并将
[first,middle]之间的元素重新建立大顶堆,直至遍历结束;
3:对[first,middle]间的元素排序
sort:需要两个随即迭代器
故:list,slist不能使用,只能使用本身的成员函数
关系型容器,以RB_tree实现,不需要;
stack,queue和priority-queue有特别的入口,不允许对元素排序
其中(1)快排:采用三点中值选取枢轴
(2)阈值的选择:本无定论,因设备而异,STL采用16,《编程珠玑》作者,选取100万个数,对阈值在[1,100]实验,最佳值为50
(3)最后,几近排序,但未完成时,采用插入排序。
(4)快排会恶化为n*n,sort()使用内省式排序,2:对[middle,last)间的元素遍历,若小于堆顶元素,则与堆顶元素交换,并将
[first,middle]之间的元素重新建立大顶堆,直至遍历结束;
3:对[first,middle]间的元素排序
对区间每个元素实行操作
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>());