STL部分算法
来源:互联网 发布:关于做好网络司法拍卖 编辑:程序博客网 时间:2024/05/17 01:35
以vector和array为底层,实现heap算法的区别?
array为低层实现时,对满载的数组,不能再进行push_heap()操作
不太方便,安全
低层以vector实现的例子
低层以array实现的例子
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,的版本:
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()使用内省式排序,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>());
- STL部分算法
- STL迭代器与部分算法学习笔记
- STL相关算法部分源代码学习
- STL部分
- Primer STL笔记第二部分容器与算法
- STL源码剖析 - 第6章 算法 - 6.7.8 部分元素排序算法
- STL部分排序
- STL的部分实现
- STL部分的实现
- STL算法
- STL 算法
- STL 算法
- STL-算法
- STL算法
- STL 算法
- STL算法
- STL算法
- STL 算法
- 服务器并发策略
- 安装Apache提示APR not found的解决办法
- Mysql数据库优化技术之配置篇、索引篇
- HugePage简介和KVM中使用HugePage
- 嫁了点评,剩了豆瓣
- STL部分算法
- 伤心人
- Linux 系统编程学习-文件I/O操作
- 利用resteasy框架构建rest webservice----第五波:java代码调用乱码解决方案
- [排序&&模拟]Lining Up uva270
- 关于系统架构的一些思考
- android 的NDK在Windwos环境搭建(一)
- 这样解决浏览器不兼容问题 .
- 有一天,你也会遇到这样的事吗