effective stl 第34条:了解哪些算法需要使用排序的区间作为参数。
来源:互联网 发布:gg是什么意思网络用语 编辑:程序博客网 时间:2024/04/27 11:32
很多排序算法要求随机访问迭代器,所以对List的元素不可能调用这种算法。
有些算法要求排序的区间,即区间中的值是排过序的。
有些算法既可以与排序的区间一起工作,也可以与未排序的区间一起工作,但是当他们用在排序的区间时,算法会更加的高效。
要求排序区间的算法:
binary_search lower_bound upper_bound equal_range
set_union set_intersection set_difference set_symmetric_difference
merge inplace_merge includes
但是,下边的算法不需要排序的区间:
unique unique_copy
binary_search、lower_bound、upper_bound和equal_range要求排序的区间,因为它们使用的是二叉查找树。这些算法承诺了对数时间的查找效率,但是前提条件是,你必须提供已经按照顺序排好的数据。
merge和inplace _merge实际上实现了合并和排序的联合操作:他们读入两个排序的区间,然后合并成一个新的区间,其中包含了原来两个区间中的所有元素。他们具有线性时间的性能,但是它们不知道原区间已经排过序,它们就不可能在线性时间内完成。
inludes用来判断一个区间中的所有对象是否都在另一个区间中,因为includes总是假设两个区间是排序的,所以它承诺线性时间的效率。如果没有这一前提,他通常会运行的很慢。
#include<iostream>#include<vector>#include<algorithm>#include<functional>using namespace std;int main(){ vector<int> v; v.reserve(10); for (int i = 1; i <= 10; i++) { v.push_back(rand()); } //greater<int>的头文件是functional sort(v.begin(), v.end(), greater<int>());//按照降序进行排列 bool a5Exists = binary_search(v.begin(), v.end(), 5); //binary_search默认情况下假设区间是用“<”排序(即按照升序排列的),但是这个例子中的向量是按照降序排列的。 //因为区间的排序方式与算法期望的排序方式不一致,就不能得到正确的结果。 //要让上边的算法能正常工作,你就必须告诉binary_search使用与sort相同的比较函数 bool a5Exists = binary_search(v.begin(), v.end(), 5, greater<int>()); return 0;}
所有要求排序区间的算法均使用等价性来判断
所有需要有序区间的算法(也就是除了unique和unique_copy外本条款的所有算法)通过等价来判断两个值是
否“相同”,就像标准关联容器(它们本身是有序的)。相反,unique和unique_copy判断两个对象“相
同”的默认方式是通过相等,但是你可以通过传给这些算法一个定义了“相同”的意义的判断式来覆盖这个
默认情况。等价和相等之间区别的详细讨论,参考条款19。
- effective stl 第34条:了解哪些算法需要使用排序的区间作为参数。
- effective stl 第46条:考虑使用函数对象而不是函数作为STL算法的参数
- effective stl 第31条:了解与各种排序相关的选择
- effective stl 第37条:使用accumulate或者for_each进行区间统计
- effective stl 第30条:确保目标区间足够大
- effective stl 第10条:了解分配子(allocator)的约定和限制
- effective stl 第16条: 了解如何把vector和string数据传给旧的API
- effective stl 第33条:对包含指针的容器使用remove这一类算法时要特别小心
- Effective stl 第23条:考虑用排序的vector代替关联容器
- Effective stl 第6条
- effective stl 第15条
- effective stl 第44条:容器的成员函数优先于同名的算法
- Effective STL 第5条:区间成员函数优先于与之对应的单元素成员函数
- effective stl 第43条:算法调用优先于手写的循环
- effective stl 第18条: 避免使用vector<bool>
- effective stl 第14条:使用reserve来避免不必要的重新分配
- effective stl 第17条: 使用“swap 技巧”除去多余的容量
- effective stl 第27条:使用distance和advance将容器的const_iterator转换为iterator
- 如何安装最新的 XFCE 桌面?
- 文章标题
- 操作系统--引论
- spring IOC详细解释
- 个人简历
- effective stl 第34条:了解哪些算法需要使用排序的区间作为参数。
- 基本过滤选择器
- ios客户端学习-如何在storyboard中给一个viewController添加navigationController
- 文章标题
- 王家林Spark 课程,蘑菇云,IMF真相
- Android: View
- Leetcode-6. ZigZag Conversion
- 直接插入排序法
- Servlet 生命周期、工作原理