zoukankan      html  css  js  c++  java
  • Effective_STL 学习笔记(三十一) 了解你的排序选择

    排序出 20 个质量最高的 Widget,一种算法叫作 partial_sort

    1   bool qualityCompare( const Widget & lhs, const Widget & rhs )
    2   {
    3     // 返回 lhs 的质量是不是比 rhs 的质量好
    4   }
    5   . . .
    6   partial_sort( widget.begin(), widget.begin() + 20, widget.end(), qualityCompare );
    7       // 把最好的 20 个元素(按顺序)放在 widget 的前端

    选出任意 20 个质量最好的 widget(不排序),使用算法 nth_element

    1   nth_element( widgets.begin(), widgets.begin() + 19, widgets.end(), qualityCompare );
    2                   // 把最好的 20 个元素放在 widget 前端,不排序

    选出前两个最好等级的元素,使用算法 partition:

    1   bool hasAcceptableQuality( const Widget & w )
    2   {
    3     // 返回 w 质量等级是否是 2 或更高
    4   }
    5   vector<Widget>::iterator goodEnd =
    6     partiation( widgets.begin(), widgets.end(), hasAccetableQuality );
    7         // 把所有满足hasAccetableQuality 的widgets移动到 widgets 前端

    完成后,widgets.begin() 到goodEnd的区间容纳了质量是 1 或 2 的 Widget稳定的算法是 stable_partition

    算法 sort、stable_sort、partial_sort 和 nth_element 需要随机访问迭代器,

    所以只能用于 vector、string、deque 和数组,对于标准关联容器无意义。

    list::sort 提供了稳定排序,可以间接进行 list 元素 partial_sort 或 nth_element

    partition 和 stable_partition 与 sort、stable_sort、partial_sort 和 nth_element 不同,

    只需双向迭代器,因此可以在任何标准序列迭代器上使用 partition 和 stable_parttion

    总结排序选择:

    1. 需要在 vector、string、deque 或数组上进行完全排序,可以使用 sort 或 stable_sort

    2. 对于 vector、string、deque 或数组,只需要排序前 n 个元素,使用 partial_sort

    3. 对于 vector、string、deque 或数组,只需选出前 n 个元素(不排序),使用 nth_element

    4. 如果需要把标准序列容器的元素或数组分隔为满足和不满足某个标准,则需要 partition 或 stable_partition

    5. 如果数据是在 list 中,可以直接使用的是 partition 和 stable_partition,

     可以使用 list 的 sort 来代替算法 sort 或 stable_sort,

     如果需要 partial_sort 或 nth_element 提供的效果,需要间接完成

    另外,可以把数据放在标准关联容器中来保持数据有序,可以考虑标准非 STL 容器 priority_queue,它也可以总是保持数据有序,priority_queue 不在 STL 是因为没有迭代器

    算法排序(时间和空间):

      1. partition

      2. stable_partition

      3. nth_element

      4. partial_sort

      5. sort

      6. stable_sort

  • 相关阅读:
    n皇后问题
    POJ2155 Matrix二维线段树经典题
    hiho一下 第六十六周
    hdu1754 I hate it线段树模板 区间最值查询
    hdu5481 Desiderium
    自增运算符
    hdu-1823 Luck and Love
    Oracle 函数大全
    对前台传过来的实体是否为空 进行为空校验的N种方法
    IOC和DI的区别详解
  • 原文地址:https://www.cnblogs.com/kidycharon/p/10038523.html
Copyright © 2011-2022 走看看