zoukankan      html  css  js  c++  java
  • list容器的sort函数

    stl里list容器的sort需要自己定义实现,初看源码一头雾水,有位大佬分析的很好,故作此记录

    https://blog.csdn.net/chenhanzhun/article/details/39337331counter

    源代码如下(2.91版)

    void list<T, Alloc>::sort() {
      /*节点数量为一个或者0个不需要排序*/
      if (node->next == node || link_type(node->next)->next == node) return;
      list<T, Alloc> carry;
      list<T, Alloc> counter[64];
      int fill = 0;
      while (!empty()) {
        /*每次从this中取一个元素放入carrry直到取完*/
        carry.splice(carry.begin(), *this, begin());
        int i = 0;
        while(i < fill && !counter[i].empty()) {
          /*合并carry刚刚取下的那个值到counter[i]*/
          /*merge后为有序*/
          counter[i].merge(carry);
          /*交换排好序的counter[i]到carry*/
          /*注意这里的后++*/
          carry.swap(counter[i++]);
        }
        /*将carry和counter[i]交换*/
        /*注意i的变化,每次从源链表取一个元素i都会重置0,还有内循环的后++*/
        carry.swap(counter[i]);         
        if (i == fill) ++fill;
      } 
      /*counter数组大合并*/
      for (int i = 1; i < fill; ++i) counter[i].merge(counter[i-1]);
    
      /*将排好序的counter(此时所以元素都排好序在counter[fill-1]中了)交换到源链表*/
      swap(counter[fill-1]);
    }

    这里采用的排序思想,就是从待排序list中一个个截取出元素,然后合并到中转list保存,最后等到源list为空后再交换回来(carry和counter就是中转作用)没明白为什么counter数组list是64个,可能是专家经验或者是啥,不过不重要,看算法还是先别太钻牛角尖,目前没有太大意义

    ps:还是太cai

  • 相关阅读:
    (转)HTTP、TCP和HTTPS
    使用覆盖索引优化like查询
    Laravel 源码解析(一)
    redis 缓存策略注意的问题总结
    laravel 监听mysql操作 生成时间
    CommonJS, AMD, CMD 笔记
    php json_encode小数精度丢失的问题
    Python通过pandas操作excel常用功能
    Vmware 虚拟化技术
    磁盘中的esp分区与msr分区
  • 原文地址:https://www.cnblogs.com/Cxiangyang/p/13914984.html
Copyright © 2011-2022 走看看