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 判断两个对象 “相同” 的默认方式是通过相等,但是可以通过传递给这些算法一个定义 “相同” 的意义的判断式来覆盖这个默认的情况