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
纯属记录程序人生,如有差错,欢迎指正,轻喷
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于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最大的设计失误
· 单元测试从入门到精通