zoukankan      html  css  js  c++  java
  • stl::sort 算法的跟踪

      1 // basics/tracer.hpp
      2 #include <iostream>
      3 class SortTracer
      4 {
      5 private:
      6     int value;                  // 用来排序的整数
      7     int generation;             // 此追踪器的生成个数
      8     static long n_created;      // 构造函数被调用的次数
      9     static long n_destroyed;    // 析构函数被调用的次数
     10     static long n_assigned;     // 赋值次数
     11     static long n_compared;     // 比较次数
     12     static long n_max_live;     // 同一时间最多存在几个objects
     13     
     14     // 重新计算「同一时间最多存在几个objects」
     15     static void update_max_live()
     16     {
     17         if (n_created - n_destroyed > n_max_live)
     18         {
     19             n_max_live = n_created-n_destroyed;
     20         }
     21     }
     22 public:
     23     static long creations()
     24     {
     25         return n_created;
     26     }
     27     static long destructions()
     28     {
     29         return n_destroyed;
     30     }
     31     static long assignments()
     32     {
     33         return n_assigned;
     34     }
     35     static long comparisons()
     36     {
     37         return n_compared;
     38     }
     39     static long max_live()
     40     {
     41         return n_max_live;
     42     }
     43     
     44 public:
     45 // 构造函数 (constructor)
     46     SortTracer (int v = 0) 
     47         :value(v), 
     48         generation(1)
     49     {
     50         ++n_created;
     51         update_max_live();
     52         std::cerr << "SortTracer #" << n_created
     53                   << ", created generation " << generation
     54                   << " (total: " << n_created - n_destroyed
     55                   << ')' << std::endl;
     56     }
     57 // copy 构造函数(copy constructor)
     58     SortTracer (SortTracer const& b)
     59         : value(b.value), 
     60         generation(b.generation+1)
     61     {
     62         ++n_created;
     63         update_max_live();
     64         std::cerr << "SortTracer #" << n_created
     65                   << ", copied as generation " << generation
     66                   << " (total: " << n_created - n_destroyed
     67                   << ')' << std::endl;
     68     }
     69  // 解构式(destructor)
     70     ~SortTracer()
     71     {
     72         ++n_destroyed;
     73         update_max_live();
     74         std::cerr << "SortTracer generation " << generation
     75                   << " destroyed (total: "
     76                   << n_created - n_destroyed << ')' << std::endl;
     77     }
     78 // 赋值(assignment)
     79     SortTracer& operator= (SortTracer const& b)
     80     {
     81         ++n_assigned;
     82         std::cerr << "SortTracer assignment #" << n_assigned
     83                   << " (generation " << generation
     84                   << " = " << b.generation
     85                   << ')' << std::endl;
     86         value = b.value;
     87         return *this;
     88     }
     89     // 比较(comparison)
     90     friend bool operator < (SortTracer const& a,
     91                             SortTracer const& b)
     92     {
     93         ++n_compared;
     94         std::cerr << "SortTracer comparison #" << n_compared
     95                   << " (generation " << a.generation
     96                   << " < " << b.generation
     97                   << ')' << std::endl;
     98         return a.value < b.value;
     99     }
    100     int val() const
    101     {
    102         return value;
    103     }
    104 };

    下面的测试程序对std::sort算法进行一系列的跟踪

     1 #include "first.hpp"
     2 #include <iostream>
     3 #include <algorithm>
     4 
     5 long SortTracer::n_created = 0;
     6 long SortTracer::n_destroyed = 0;
     7 long SortTracer::n_max_live = 0;
     8 long SortTracer::n_assigned = 0;
     9 long SortTracer::n_compared = 0;
    10 
    11 int main()
    12 {
    13 // 准备样本数据源
    14     SortTracer input[] = { 7, 3, 5, 6, 4, 2, 0, 1, 9, 8 };
    15 // 打印起始值
    16     for (int i=0; i<10; ++i)
    17     {
    18         std::cerr << input[i].val() << ' ';
    19     }
    20     std::cerr << std::endl;
    21 // 记录起始值
    22     long created_at_start = SortTracer::creations();
    23     long max_live_at_start = SortTracer::max_live();
    24     long assigned_at_start = SortTracer::assignments();
    25     long compared_at_start = SortTracer::comparisons();
    26 // 执行算法
    27     std::cerr << "---[ Start std::sort() ]--------------------" << std::endl;
    28     std::sort<>(&input[0], &input[9]+1);
    29     std::cerr << "---[ End std::sort() ]----------------------" << std::endl;
    30 // 检验结果
    31     for (int i=0; i<10; ++i)
    32     {
    33         std::cerr << input[i].val() << ' ';
    34     }
    35     std::cerr << std::endl << std::endl;
    36 // 最终报告
    37     std::cerr << "std::sort() of 10 SortTracer's"
    38               << " was performed by: " << std::endl
    39               << SortTracer::creations() - created_at_start
    40               << " temporary tracers" << std::endl << ' '
    41               << "up to "
    42               << SortTracer::max_live()
    43               << " tracers at the same time ("
    44               << max_live_at_start << " before)" << std::endl << ' '
    45               << SortTracer::assignments() - assigned_at_start
    46               << " assignments" << std::endl << ' '
    47               << SortTracer::comparisons() - compared_at_start
    48               << " comparisons" << std::endl << std::endl;
    49 }

    最终运行结果:

    SortTracer #1, created generation 1 (total: 1)
    SortTracer #2, created generation 1 (total: 2)
    SortTracer #3, created generation 1 (total: 3)
    SortTracer #4, created generation 1 (total: 4)
    SortTracer #5, created generation 1 (total: 5)
    SortTracer #6, created generation 1 (total: 6)
    SortTracer #7, created generation 1 (total: 7)
    SortTracer #8, created generation 1 (total: 8)
    SortTracer #9, created generation 1 (total: 9)
    SortTracer #10, created generation 1 (total: 10)
    7 3 5 6 4 2 0 1 9 8 
    ---[ Start std::sort() ]--------------------
    SortTracer comparison #1 (generation 1 < 1)
    SortTracer #11, copied as generation 2 (total: 11)
    SortTracer assignment #1 (generation 1 = 1)
    SortTracer assignment #2 (generation 1 = 2)
    SortTracer generation 2 destroyed (total: 10)
    SortTracer comparison #2 (generation 1 < 1)
    SortTracer #12, copied as generation 2 (total: 11)
    SortTracer comparison #3 (generation 2 < 1)
    SortTracer assignment #3 (generation 1 = 1)
    SortTracer comparison #4 (generation 2 < 1)
    SortTracer assignment #4 (generation 1 = 2)
    SortTracer generation 2 destroyed (total: 10)
    SortTracer comparison #5 (generation 1 < 1)
    SortTracer #13, copied as generation 2 (total: 11)
    SortTracer comparison #6 (generation 2 < 1)
    SortTracer assignment #5 (generation 1 = 1)
    SortTracer comparison #7 (generation 2 < 1)
    SortTracer assignment #6 (generation 1 = 2)
    SortTracer generation 2 destroyed (total: 10)
    SortTracer comparison #8 (generation 1 < 1)
    SortTracer #14, copied as generation 2 (total: 11)
    SortTracer comparison #9 (generation 2 < 1)
    SortTracer assignment #7 (generation 1 = 1)
    SortTracer comparison #10 (generation 2 < 1)
    SortTracer assignment #8 (generation 1 = 1)
    SortTracer comparison #11 (generation 2 < 1)
    SortTracer assignment #9 (generation 1 = 1)
    SortTracer comparison #12 (generation 2 < 1)
    SortTracer assignment #10 (generation 1 = 2)
    SortTracer generation 2 destroyed (total: 10)
    SortTracer comparison #13 (generation 1 < 1)
    SortTracer #15, copied as generation 2 (total: 11)
    SortTracer assignment #11 (generation 1 = 1)
    SortTracer assignment #12 (generation 1 = 1)
    SortTracer assignment #13 (generation 1 = 1)
    SortTracer assignment #14 (generation 1 = 1)
    SortTracer assignment #15 (generation 1 = 1)
    SortTracer assignment #16 (generation 1 = 2)
    SortTracer generation 2 destroyed (total: 10)
    SortTracer comparison #14 (generation 1 < 1)
    SortTracer #16, copied as generation 2 (total: 11)
    SortTracer assignment #17 (generation 1 = 1)
    SortTracer assignment #18 (generation 1 = 1)
    SortTracer assignment #19 (generation 1 = 1)
    SortTracer assignment #20 (generation 1 = 1)
    SortTracer assignment #21 (generation 1 = 1)
    SortTracer assignment #22 (generation 1 = 1)
    SortTracer assignment #23 (generation 1 = 2)
    SortTracer generation 2 destroyed (total: 10)
    SortTracer comparison #15 (generation 1 < 1)
    SortTracer #17, copied as generation 2 (total: 11)
    SortTracer comparison #16 (generation 2 < 1)
    SortTracer assignment #24 (generation 1 = 1)
    SortTracer comparison #17 (generation 2 < 1)
    SortTracer assignment #25 (generation 1 = 1)
    SortTracer comparison #18 (generation 2 < 1)
    SortTracer assignment #26 (generation 1 = 1)
    SortTracer comparison #19 (generation 2 < 1)
    SortTracer assignment #27 (generation 1 = 1)
    SortTracer comparison #20 (generation 2 < 1)
    SortTracer assignment #28 (generation 1 = 1)
    SortTracer comparison #21 (generation 2 < 1)
    SortTracer assignment #29 (generation 1 = 1)
    SortTracer comparison #22 (generation 2 < 1)
    SortTracer assignment #30 (generation 1 = 2)
    SortTracer generation 2 destroyed (total: 10)
    SortTracer comparison #23 (generation 1 < 1)
    SortTracer #18, copied as generation 2 (total: 11)
    SortTracer comparison #24 (generation 2 < 1)
    SortTracer assignment #31 (generation 1 = 2)
    SortTracer generation 2 destroyed (total: 10)
    SortTracer comparison #25 (generation 1 < 1)
    SortTracer #19, copied as generation 2 (total: 11)
    SortTracer comparison #26 (generation 2 < 1)
    SortTracer assignment #32 (generation 1 = 1)
    SortTracer comparison #27 (generation 2 < 1)
    SortTracer assignment #33 (generation 1 = 2)
    SortTracer generation 2 destroyed (total: 10)
    ---[ End std::sort() ]----------------------
    0 1 2 3 4 5 6 7 8 9 
    
    std::sort() of 10 SortTracer's was performed by: 
    9 temporary tracers
     up to 11 tracers at the same time (10 before)
     33 assignments
     27 comparisons
    
    SortTracer generation 1 destroyed (total: 9)
    SortTracer generation 1 destroyed (total: 8)
    SortTracer generation 1 destroyed (total: 7)
    SortTracer generation 1 destroyed (total: 6)
    SortTracer generation 1 destroyed (total: 5)
    SortTracer generation 1 destroyed (total: 4)
    SortTracer generation 1 destroyed (total: 3)
    SortTracer generation 1 destroyed (total: 2)
    SortTracer generation 1 destroyed (total: 1)
    SortTracer generation 1 destroyed (total: 0)
  • 相关阅读:
    php设计模式之桥接模式
    php设计模式适配器模式
    php设计模式之装饰器模式
    php设计模式之策略模式
    php设计模式之责任链模式
    Graphics.DrawString 方法
    算法7-10:拓扑排序
    一年成为Emacs高手(像神一样使用编辑器)
    动态规划0—1背包问题
    辛星解读为什么PHP须要模板
  • 原文地址:https://www.cnblogs.com/dLong/p/4189268.html
Copyright © 2011-2022 走看看