首页 > 其他 > 详细

list容器的sort函数

时间:2020-11-02 17:45:00      阅读:33      评论:0      收藏:0      [点我收藏+]

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

list容器的sort函数

原文:https://www.cnblogs.com/Cxiangyang/p/13914984.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!