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

  • 相关阅读:
    weblogic详解
    Java实现视频网站的视频上传、视频转码、及视频播放功能(ffmpeg)
    Java上传视频(mencoder)
    input标签type="file"上传文件的css样式
    jQuery系列:选择器
    jQuery系列:Ajax
    Sql Server系列:规范化及基本设计
    Sql Server系列:查询分页语句
    Sql Server系列:通用表表达式CTE
    Sql Server系列:子查询
  • 原文地址:https://www.cnblogs.com/Cxiangyang/p/13914984.html
Copyright © 2011-2022 走看看