[5 算法] 34. 要求使用排序的区间作为参数的算法

有些算法要求使用排序的区间;有些算法使用排序的区间,效率会更高。

要求使用排序区间的STL算法如下:

1 binary_search,lower_bound,upper_bound,equal_range

2 set_union,set_intersection,set_difference,set_symmetric_difference

3 merge,inplace_merge

4 includes

另外,如下算法不要求排序的区间,但通常与排序的区间一起使用:

5 unique,unique_copy

1 binary_search,lower_bound,upper_bound,equal_range

用于查找的算法要求排序的区间,它们使用二分法查找。

对数时间的查找效率,前提是测试区间已经排序和拥有随机访问迭代器。

2 set_union,set_intersection,set_difference,set_symmetric_difference

只有提供了排序的区间,才能保证线性时间效率的集合操作

3 merge,inplace_merge

实现了合并和排序的联合操作:它们读入两个排序的区间,然后合并为一个新的排序区间。

只有源区间已经排过序,才能保证线性时间。

4 includes

用来判断一个区间中的所有对象是否在另一个区间中。

只有两个区间已经排过序,才能保证线性时间。

5 unique,unique_copy

删除每一组连续相等的元素,仅保留其中的第一个。

注意:unique并非真正意义上的删除。(见32条)

STL允许你为排序操作选择特定的比较函数,所以不同的区间可能有不同的排序方式。如果你为算法提供了一个排序的区间,而这个算法也带一个比较函数作为参数,那么,你一定要保证算法的比较函数与排序区间使用的比较函数有一致的行为。

下面这个例子说明了不一致的情形:

vector<int> v;
...
// 降序排列
sort(v.begin(), v.end(), greater<int>());
...
// 在数组中查找5,默认这个区间是升序排序的
bool r = binary_search(v.begin(), v.end(), 5);

binary_search默认情况下是升序排序,和排序sort行为不一致,则不会得到预期结果了。

修改如下:

// binary_search使用升序查找
bool r = binary_search(v.begin(), v.end(), 5, greater<int>());

总结:

1 提供排序的区间

2 保证算法使用的比较函数与排序使用的比较函数行为一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值