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

posted @   乐swap火  阅读(276)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示