Effective_STL 学习笔记(三十四) 注意哪个算法需要有序区间

 

不是所有的算法可以用于任意区间,比如:

1. remove 需要前向迭代器和可以通过这些迭代器赋值能力,所以不能应用于输入迭代器的划分区间,也不能是 map 或 multimap,也不能是 set 和 multiset 的一些实现。

2. 很多排序算法需要随机访问迭代器,所以不能在一个 list (list 实现是基于双向迭代器)的元素上调用这些算法

 

一些算法需要有序值的空间:

    binary_search    lower_bound

    upper_bound     equal_range

    set_union        set_intersection

    set_difference    set_symmetric_difference

    merge         inplace_merge

    inlcludes

下面算法一般用于有序,虽然不要求:

    unique         unique_copy

 

搜索算法 binary_search、lower_bound、upper_bound 和 equal_range 需要有序区间,因为它们使用二分法查找来搜索值。

 

算法 set_union、set_intersection、set_difference 和 set_symmetric_difference 的四人组提供了线性时间设置它们名字所提出的操作的性能。有序区间是为了保证线性时间完成工作

 

merge 和 inplace_merge 执行了有效的单遍合并排序算法: 它们读取两个有序区间,然后产生一个包含了两个源区间所有元素的新有序区间。它们以线性时间执行,如果他们不知道源区间有序就不能完成。

 

includes 用来检测是否一个区间的所有对象也在另一个区间中,因为 includes 可能假设它的两个区间都已经有序,所以它保证了线性时间性能。

 

unique 和 unique_copy 甚至在无序区间也提供了定义了良好的行为:

  从每个相等元素的连续组中的去除第一个以外所有的元素

实际上,unique 一般用于从区间中去除所有重复值,所以几乎总是要确保你传递个 unique(或unique_copy)的区间是有序的。

顺便说说,unique 从一个区间除去元素的方式和 remove 一样,只是区分出而不是去除元素

 

所有需要有序区间的算法(也就是除了 unique 和 unique_copy 外本款的所有算法)通过等价来判断两个值是否 “相同”,就像标准关联容器(本身是有序的)。相反,unique 和 unique_copy 判断两个对象 “相同” 的默认方式是通过相等,但是可以通过传递给这些算法一个定义 “相同” 的意义的判断式来覆盖这个默认的情况

 

posted @ 2018-11-29 19:44  KidyCharon  阅读(113)  评论(0编辑  收藏  举报