effective stl 第34条:了解哪些算法需要使用排序的区间作为参数。

很多排序算法要求随机访问迭代器,所以对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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值