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。

0 0
原创粉丝点击