STL源码剖析——P142关于list::sort函数
在list容器中,由于容器自身組織數據的特殊性,所以list提供了自己的排序函數list::sort, 并且實現得相當巧妙,不過《STL源碼剖析》的原文中,我有些許疑問,對于該排序算法,侯認為是采用了快排,但是經過仔細分析,我認為是采用了歸并來實現的。
list::sort函數的實現位于stl_list.h文件,源碼及注釋如下:
template <class T, class Alloc> void list<T, Alloc>::sort() {
??? if (node->next == node || link_type(node->next)->next == node) return;
? ? list<T, Alloc> carry;
??? // 對于索引i的元素counter[i],存放的是節點數為2^i的list數據
? ? list<T, Alloc> counter[64];
? ? int fill = 0;
??? while (!empty()) {
??????? //每次循環,都從當前list中取出頭結點,接合到carry中去
??????? //即每次循環開始時,carry都只從當前list中取出一個結點(頭結點)
??????? carry.splice(carry.begin(), *this, begin());
??????? int i = 0;
??????? while(i < fill && !counter[i].empty()) {
? ???????? //從索引0開始,將carry中的list結點歸并到counter[i]中去
? ???????? counter[i].merge(carry);
?? ??????? //執行交換操作,將歸并后的結果存入carry,交換前,carry為空,交換后counter[i]為空
? ???????? carry.swap(counter[i++]);
?????? }
?????? carry.swap(counter[i]);
???????if (i == fill) ++fill;
???? ? //記錄counter中當前已經填充了數據的元素的最高索引
??? }
??? for (int i = 1; i < fill; ++i) counter[i].merge(counter[i-1]);
? ? //將counter中遺留的元素歸并 ? swap(counter[fill-1]);
? ? //將排序后的結果換入當前list所在的空間上
}
遺留問題:counter[64],為什么要用64?還未弄明白,留待弄明白后,再作記錄……
轉載于:https://www.cnblogs.com/crazyhf/archive/2012/12/17/2822129.html
總結
以上是生活随笔為你收集整理的STL源码剖析——P142关于list::sort函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA接口回调
- 下一篇: windbg-奔溃生成的dump文件