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

    xiaoxiao2023-03-24  4

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

    转载请注明原文地址: https://ju.6miu.com/read-1201976.html
    最新回复(0)