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

  • 相关阅读:
    2017年8月27日 星期日 --出埃及记 Exodus 29:6
    2017年8月26日 星期六 --出埃及记 Exodus 29:5
    2017年8月25日 星期五 --出埃及记 Exodus 29:4
    2017年8月24日 星期四 --出埃及记 Exodus 29:3
    2017年8月23日 星期三 --出埃及记 Exodus 29:2
    2017年8月22日 星期二 --出埃及记 Exodus 29:1
    2016年12月总结
    2016年11月总结
    2016年10月总结
    项目风险说明
  • 原文地址:https://www.cnblogs.com/kidycharon/p/10040137.html
Copyright © 2020-2023  润新知