很多排序算法要求随机访问迭代器,所以对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。